线程的六种状态: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内容请搜索靠谱客的其他文章。
发表评论 取消回复