创建线程的几种方式
- Thread:
- Runanble:
- Callanble:需要引入中间人来开始线程的方法
public class demo1 {
public static void main(String[] args) throws ExecutionException, InterruptedException {
//lambda表达式
FutureTask<Integer> futureTask1 = new FutureTask(()->{
System.out.println(Thread.currentThread().getName()+"come in callable");
return 1024;
});
//创建线程
new Thread(futureTask1,"callable").start();
//判断线程是否执行完
while (!futureTask1.isDone()){
System.out.println("wait.....");
}
//调用FutureTask的get 方法
System.out.println(futureTask1.get());
}
}
线程的几种状态:
image.png
- 新建状态(NEW):新创建了一个线程对象
- 就绪状态(Runanble):线程对象执行了start方法
- 运行状态(Runing):线程获取了cpu时间片
- 阻塞(Blocked):线程因为某种种原因放弃了cpu使用权
等待阻塞:运行(runing)的线程执行了wait()方法,jvm会把线程放入等待线程池中
同步阻塞:运行(runing)的线程在获取对象同步锁时,诺该同步锁被别的线程占用。则jvm会把该线程放入锁池中(lock pool)
其他阻塞:运行(running)的线程执行Thread.sleep(long ms)或Thread.join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入可运行(runnable)状态。
- 死亡(Dead):线程run(),main()方法执行结束或异常退出了run()方法,线程结束生命周期
线程池常用的方法
-
sleep():让当前线程由“运行状态”进入到“休眠(阻塞)”状态。休眠时间片过来会自动唤醒
-
wait():让当前线程处于“等待(阻塞)状态”,“直到其他线程调用此对象的notify()方法或是notifyAll()方法”,当前线程被唤醒(进入“就绪状态”)
-
join():让主线程等待(WAITING状态)或者说执行为被执行join()等待,一直等到join其他线程不再活动为止。
-
yield():作用是让步,它能让当前线程由“运行状态”进入到“就绪状态”,从而让其他具有相同优先级的等待线程获取执行权;但是,并不能保证在当前线程调用yield()之后,其他具有相同优先级的线程就一定能获得执行权;也有可能是当前线程有进入到“运行状态”继续运行。
网友评论