概述
线程的六种状态:1、NEW 新建状态
2、BLOCKED 阻塞状态
3、RUNNABLE 运行状态
4、TERMINATEND 死亡状态
5、TIMED_WAITING 休眠状态
6、WAITING 无限等待状态
等待唤醒案例:线程间的通信
注意:1、不同线程必须使用同步代码块包裹起来,保证等待和唤醒只能有一个在执行
2、同步使用的锁对象必须保证唯一
3、只有锁对象才能调用wait和notify方法
示例代码:
public class Demo { public static void main(String[] args){ Object obj = new Object(); new Thread(() -> { synchronized (obj){ System.out.println("开启下载图片线程"); try { obj.wait(); System.out.println("图片下载完成"); }catch (Exception e){ e.printStackTrace(); } } }).start(); new Thread(){ public void run(){ try { System.out.println("图片下载中"); Thread.sleep(2000); }catch (Exception e){ e.printStackTrace(); } synchronized (obj){ obj.notify(); } } }.start(); } }
线程池:就是一个容纳多个线程的容器,其中的线程可以反复使用,省去了频繁创建线程对象的操作,无需反复创建线程而消耗过多资源
java.util.concurrent.Excutors:线程池的工厂类,用来生成线程池
static ExecutorService newFixedThreadPool(int nThreads): 创建一个可重用固定线程数的线程池
参数:
int nThreads:创建线程池中包含的线程数量
返回值:
ExecutorService接口,返回的是ExecutorService接口的实现类对象,我们可以使用ExecutorService接口接收
java.util.concurrent.executorService:线程池接口
用来从线程池中获取线程,调用start方法,执行线程任务
submit(Runnable task)
关闭和销毁线程池的方法
void shutdown()
线程池的使用步骤:1、使用线程池的工厂类Executors里边提供的静态方法newFixedThreadPool生产一个指定线程数量的线程池
2、创建一个类,实现Runnable接口,重写run方法,设置线程任务
3、调用ExecutorService中的方法,submit,传递线程任务,开启线程,执行run方法
4、调用ExecutorService中的方法,shutdown销毁线程池(不建议执行)
public class Demo { public static void main(String[] args){ ExecutorService es = Executors.newFixedThreadPool(5); MyThread2 myt1 = new MyThread2(); MyThread2 myt2 = new MyThread2(); MyThread2 myt3 = new MyThread2(); MyThread2 myt4 = new MyThread2(); MyThread2 myt5 = new MyThread2(); MyThread2 myt6 = new MyThread2(); es.submit(myt1); es.submit(myt2); es.submit(myt3); es.submit(myt4); es.submit(myt5); es.submit(myt6); } }
lambda表达式:一些参数
一个箭头
一段代码
格式:(参数类型 参数名称)->{代码语句}
解释:():接口中抽象方法的参数列表,没有参数就空着
-> : 把参数传递给方法体
{ } : 重写接口的方法体
例如:invokeCook(()->{"接口内部唯一一个无参数,无返回值的方法"})
Arrays.sort(arr,(Person o1,Person o2)->{return o1.getAge()-o2.getAge()});
使用lambda的前提:1、必须是接口,且接口中有且仅有一个抽象方法
2、可以进行上下文推断
public class Demo { private static int ticket =100; public static void main(String[] args){ Lock l = new ReentrantLock(); ExecutorService es = Executors.newFixedThreadPool(5); es.submit(()->{ { while (true){ l.lock(); if(ticket>0){ System.out.println(ticket+Thread.currentThread().getName()); ticket--; } l.unlock();; } } }); } }
转载于:https://my.oschina.net/u/4131739/blog/3061443
最后
以上就是火星上春天为你收集整理的17、Java的线程状态和通信的全部内容,希望文章能够帮你解决17、Java的线程状态和通信所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复