黑马程序员——Java基础——多线程

来源:互联网 发布:数据库建模工具有哪些 编辑:程序博客网 时间:2024/06/05 09:22

           -----------android培训java培训、java学习型技术博客、期待与您交流!------------


一、多线程概念

1线程与进程

a进程就是一个运行中的程序。

b一个进程中可以有多个线程,线程是CPU调度和分派的基本单位。我们可以理解为线程就是程序运行中的一条路径。


2多线程存在的意义

a允许多个线程并发执行,提高程序运行效率。

b例如:迅雷多线程下载,QQ多个人同时聊天,凌波多个人同时共享屏幕。



二、线程的使用

1创建线程有两种方式

a、自定义一个类继承Thread类,将线程要做的事写在run()方法中,由于子类可以当父类来用,创建自定义子类对象就是创建了一个线程。

例:

class Demo extends Thread
{
public void run(){
for(int x=0;x<60;x++)
System.out.println("demo run----"+x);
}
   
}


class ThreadDemo 
{


public static void main(String[] args)
{
Demo d=new Demo();
d.start();

for(int x=0;x<60;x++)
System.out.println("hello world"+x);
}


}

结果如下:

hello world0

demo run----0
hello world1
demo run----1
hello world2
demo run----2
hello world3
demo run----3
hello world4
demo run----4
hello world5
demo run----5
demo run----6
hello world6
demo run----7
hello world7
demo run----8
hello world8
demo run----9
hello world9
demo run----10
hello world10
demo run----11
hello world11
demo run----12
hello world12
hello world13
demo run----13
hello world14
hello world15
hello world16
demo run----14
hello world17
demo run----15
demo run----16
demo run----17
hello world18
demo run----18
hello world19
demo run----19
hello world20
demo run----20
hello world21
demo run----21
hello world22
demo run----22
hello world23
demo run----23
hello world24
demo run----24
hello world25
demo run----25
hello world26
demo run----26
hello world27
demo run----27
hello world28
demo run----28
hello world29
hello world30
demo run----29
hello world31
demo run----30
hello world32
hello world33
demo run----31
hello world34
demo run----32
hello world35
demo run----33
hello world36
demo run----34
hello world37
demo run----35
hello world38
demo run----36
hello world39
demo run----37
hello world40
demo run----38
hello world41
demo run----39
demo run----40
demo run----41
demo run----42
demo run----43
demo run----44
demo run----45
demo run----46
demo run----47
hello world42
demo run----48
hello world43
demo run----49
hello world44
demo run----50
hello world45
demo run----51
hello world46
hello world47
demo run----52
hello world48
demo run----53
demo run----54
demo run----55
demo run----56
demo run----57
demo run----58
demo run----59
hello world49
hello world50
hello world51
hello world52
hello world53
hello world54
hello world55
hello world56
hello world57
hello world58
hello world59



b、自定义一个类实现Runnable接口,将要做的事写在run()方法中。创建Thread对象时在构造函数中传入Runnable实现类对象。


2线程的启动

a、两种创建方式都是调用Thread对象的start()方法。

b、当调用start()方法时,CPU会开启一条新线程,并在新线程上执行run()方法。


3线程常用方法

a、currentThread

静态方法,用来获取当前线程

b、getNamesetName

用来获取、设置当前线程的名字

c、sleep

控制线程休眠,单位为毫秒

dsetDaemon

将线程设置为守护线程。线程默认是非守护线程,守护线程不能单独执行。

e、join

当前线程暂停,等待加入的线程运行结束,当前线程继续执行。


三、多线程同步

1线程安全问题

a多线程并发访问同一数据,有可能出现线程安全问题。

b一条线程的访问还没有结束,CPU切换到另一条线程工作,导致数据访问出错。


2使用同步解决线程安全问题

a. 使用同步代码块synchronized(锁对象){需要同步的代码...}形式将访问数据的代码锁住,在同步代码块中的内容同一时间内只能一个线程执行。

b. 使用同步方法,用synchronized修饰方法,整个方法的代码都是同步的,只能一个线程运行。同步方法使用this作为锁。


3死锁

  在多个线程并发执行使用多个锁来同步时,有可能互相冲突,导致程序无法继续执行。


4同步的优点与缺点

  a同步可以解决多个线程同时访问一个共享数据的问题,只要加上同一个锁,在同一时间内只能有一条线程执行。

  b在执行同步代码时每次都会判断锁,非常消耗资源,效率较低。



四、多线程通信

1在同步代码中可以使用锁对象的wait()方法让当前线程等待

2使用锁对象的notify()方法可以将正在等待的线程唤醒

3如果多个线程都在等待,notify()唤醒随机1

4notifyAll()方法可以唤醒所有在等待的线程



五、JDK5之后的线程同步与通信

1同步

a使用java.util.concurrent.locks.Lock接口的实现类对象来进行同步

bReentrantLock就是Lock的实现类,可以实现synchronized的功能

c在需要同步的代码块前后使用lock()和unlock()方法来完成同步

dunlock()最好放在finally中,因为如果上面代码抛出异常没有解锁的话,会导致其他线程无法运行,程序卡死。


2通信

a使用Lock对象的newCondition()方法获取一个Condition对象,Condition对象可以控制指定线程的等待与唤醒。

bawait()方法可以控制线程等待。

csignal()方法可以唤醒等待的线程。

dsignalAll()方法可以唤醒所有等待线程。

 


总结:在敲代码的过程中,还是会遇到一些问题,可能是有些概念还是没弄懂,但是多找找资料,多想想也慢慢弄懂了。


0 0
原创粉丝点击