Java 多线程

线程状态


在Java当中,线程通常都有五种状态,创建、就绪、运行、阻塞和死亡。

  第一是创建状态。在生成线程对象,并没有调用该对象的start方法,这是线程处于创建状态。
  第二是就绪状态。当调用了线程对象的start方法之后,该线程就进入了就绪状态,但是此时线程调度程序还没有把该线程设置为当前线程,此时处于就绪状态。在线程运行之后,从等待或者睡眠中回来之后,也会处于就绪状态。
  第三是运行状态。线程调度程序将处于就绪状态的线程设置为当前线程,此时线程就进入了运行状态,开始运行run函数当中的代码。
  第四是阻塞状态。线程正在运行的时候,被暂停,通常是为了等待某个时间的发生(比如说某项资源就绪)之后再继续运行。sleep,suspend,wait等方法都可以导致线程阻塞。
  第五是死亡状态。如果一个线程的run方法执行结束或者调用stop方法后,该线程就会死亡。对于已经死亡的线程,无法再使用start方法令其进入就绪。


1. sleep和wait

对于sleep()方法,我们首先要知道该方法是属于Thread类中的。而wait()方法,则是属于Object类中的。

  sleep()方法导致了程序暂停执行指定的时间, 让出cpu该其他线程,但是他的监控状态依然保持者,当指定的时间到了又会自动恢复运行状态。    在调用sleep()方法的过程中,线程不会释放对象锁。

  而当调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后本线程才进入对象锁定池准备

2.waite()和notify()的区别

   waite()和notify()因为会对对象的锁标志进行操作,所以它们必须在synchronized函数或synchronized block中进行调用。如果在non-synchronized函数或non-synchronized block中进行调用,虽然能编译通过,但在运行时会发生IllegalMonitorStateException的异常。

3.join() 方法主要是让调用该方法的thread完成run方法里面的东西后, 在执行join()方法后面的代码。示例:

  1. class ThreadTesterA implements Runnable {  
  2.   
  3.     private int counter;  
  4.   
  5.     @Override  
  6.     public void run() {  
  7.         while (counter <= 10) {  
  8.             System.out.print("Counter = " + counter + " ");  
  9.             counter++;  
  10.         }  
  11.         System.out.println();  
  12.     }  
  13. }  
  14.   
  15. class ThreadTesterB implements Runnable {  
  16.   
  17.     private int i;  
  18.   
  19.     @Override  
  20.     public void run() {  
  21.         while (i <= 10) {  
  22.             System.out.print("i = " + i + " ");  
  23.             i++;  
  24.         }  
  25.         System.out.println();  
  26.     }  
  27. }  
  28.   
  29. public class ThreadTester {  
  30.     public static void main(String[] args) throws InterruptedException {  
  31.         Thread t1 = new Thread(new ThreadTesterA());  
  32.         Thread t2 = new Thread(new ThreadTesterB());  
  33.         t1.start();  
  34.         t1.join(); // wait t1 to be finished  
  35.         t2.start();  
  36.         t2.join(); // in this program, this may be removed  
  37.     }  


4.yield()方法对应了如下操作;先检测当前是否有相同优先级的线程处于同可运行状态,如有,则把CPU的占有权交给次线程,否则继续运行原来的线程,所以yield()方法称为“退让”,它把运行机会让给了同等级的其他线程。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值