我是靠谱客的博主 火星上春天,最近开发中收集的这篇文章主要介绍17、Java的线程状态和通信,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

线程的六种状态: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的线程状态和通信所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(40)

评论列表共有 0 条评论

立即
投稿
返回
顶部