Java基础总结-线程

来源:互联网 发布:软件工程学的是什么 编辑:程序博客网 时间:2024/06/18 17:03

线程

1、线程的基本概念:线程是一个程序里面不同的执行 /*路径*/  (一个线程代表一条路径)

2、线程的创建和启动

1.继承 Thread 类                   /*都需调用start方法,这样才可以使主线程和子线程并行运行*/

2.实现 Runnerable(只有一个run方法) 接口(推荐)

3、线程的调度和优先级 sleep/join/yield 方法

4、线程的状态控制

sleep/join/yield 方法

sleep方法:可以调用Thread的 /*静态*/方法,故sleep可以由类名直接调用:Thread.sleep(...)

join方法:合并某个线程(在main中执行的话,相当于直接调用某方法了,主线程和子线程不会并行)

join就是阻塞调用线程,直到该线程结束后,调用线程才能继续执行。该影响只存在于执行join方法的线程和调用该线程的线程之间

如  在t1线程中调用t2.join(),则需要t2线程执行完后t1方能继续执行

yield方法:让出CPU(只是一个时间片,并非之后不执行了),给其他线程执行的机会

设置优先级(优先级(1~10)默认为5)    t1.setPriority(Thread.NORM_PRIORITY + 3);

5、线程同步 

一个线程执行过程中,可能被另一个线程打断,则需锁定当前对象

synchronized (执行某个方法的过程中,锁定当前对象)  表明该对象在任一时刻只能由一个线程访问. 

synchronized (this) {...}    或者 public synchronized void add(...) {};

死锁:a线程需要锁定了o1,还需锁定o2;b线程需要锁定了o2,还需锁定o1;a线程无法执行完,b线程也无法执行完,此时产生死锁现象

另外: wait()、notify()、notifyAll()是三个定义在Object类里的方法,可以用来控制线程的状态。

/*如果对象调用了wait方法就会使持有该对象的线程把该对象的控制权交出去,然后处于等待状态。*/

如果对象调用了notify方法就会通知某个正在等待这个对象的控制权的线程可以继续运行。

如果对象调用了notifyAll方法就会通知所有等待这个对象控制权的线程继续运行。

sleep 和 wait 的区别: wait时别的线程可以访问锁定对象(sleep不可以)

/*另外:调用wait方法时必须锁定对象(需使用synchronized)*/ 

http://qifuguang.me/2015/10/23/wait-notify-notifyAll%E8%AF%A6%E7%BB%86%E4%BB%8B%E7%BB%8D/