
正文
java线程等待代码 java等待线程池执行结束
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
java线程wait(),notify()问题,以下是代码
把生产者的run方法这样写:
public void run() {
int n = 0;
while (n = 10) {
n++;
q.put(n);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
其实没什么特殊的,我只似乎让生产者每次生产出来一个东西之后稍稍睡一会,然后你在run一下看看效果,应该是每隔1s就会输出一次,一共11次。
你的代码本身没有问题,问题在于要知道当put方法里面notify的时候,你不会知道它会唤醒那个线程,这个完全是jvm看自己心情决定的,那么就会出现的情况是生产者跑的飞快,它可能一下子就把11次循环都跑完,然后最后一次notify完了之后以后都不会在notify了,剩下一个消费者可怜巴巴的wait,可是永远不会有人notify他了,然后就over了。
可能你不是很明白我说的意思,你按照我说的把代码改一下,然后自己思考一下,这个东西会有一个顿悟的过程,可能你一时想不明白,但是将来可能一下子就明白我的意思了。
BTW,java多线程其实还是比较复杂的,让各个线程在你的脑子里面跑起来,你如果能在自己脑子里面模拟多个线程一起跑,你就会比较容易想明白。
另外,多线程的代码debug不能给你提供什么帮助,我也有同事喜欢用debug调试多线程的程序,我对此颇为不屑,因为如果你在run里面设置了断点,那么我可以说,你永远都不会知道多线程是怎么回事,一定要在自己脑子里面想才行,实际上我让线程sleep一会实际上相当于是加一个1s的断点,1s后断点取消,程序继续跑,这个可以帮助你理解。
相关问答
Q1: java中请问如何等待一个线程结束在运行其他的代码?
使用java的线程同步机制。
现在存在两个线程a和b,伪代码如下:
在a的代码中:
b.start();//启动b线程
synchronized(b) b.wait();//a线程中采用同步,并进行等待
c.execute();
在b线程结束时调用synchronized(this) notify();
这样就可以达到b不结束,a线程就不会继续执行c。
注释:如果看不明白建议先学习一下java线程同步机制。
Q2: java 如何实现等待子线程结束
有多种实现方式,下面列出两种。
第一种:实现Callable类,使用有返回值的线程,只有线程执行完成后才会返回结果。
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.*;
public class Main {
// 初始化一个容量为10的线程池
static final ExecutorService pool = Executors.newFixedThreadPool(10);
public static void main(String[] args) throws ExecutionException, InterruptedException {
ListFutureString futures = new ArrayList();
for (int i = 0; i 3; i++) {
MyThread thread = new MyThread("线程" + i);
futures.add(pool.submit(thread));
}
for (FutureString future : futures) {
String name = future.get();
System.out.println(name + "执行完成...");
}
System.out.println("所有线程执行完成!");
}
}
class MyThread implements CallableString {
private String name;
public MyThread(String name) {
this.name = name;
}
@Override
public String call() throws Exception {
// TODO 执行业务
// 随机延迟,模拟线程耗时
Thread.sleep(1000 + new Random().nextInt(2000));
return name;
}
}
第二种:使用CountDownLatch实现线程计数,代码如下:
import java.util.Random;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Main2 {
// 初始化一个容量为10的线程池
static final ExecutorService pool = Executors.newFixedThreadPool(10);
public static void main(String[] args) throws InterruptedException {
int threadCount = 3;
// 初始化CountDownLatch,用于线程计数
CountDownLatch latch = new CountDownLatch(threadCount);
for (int i = 0; i threadCount; i++) {
MyThread thread = new MyThread("线程" + i, latch);
pool.execute(thread);
}
// 阻塞当前线程,CountDownLatch计数减为0时表示所有线程都执行完毕,才会释放主线程的阻塞
latch.await();
System.out.println("所有线程执行完成!");
}
}
class MyThread implements Runnable {
private String name;
private CountDownLatch latch;
public MyThread(String name, CountDownLatch latch) {
this.name = name;
this.latch = latch;
}
@Override
public void run() {
// TODO 执行业务
// 随机延迟,模拟线程耗时
try {
Thread.sleep(1000 + new Random().nextInt(2000));
} catch (InterruptedException e) {
}
// 计数减一
latch.countDown();
System.out.println(name + "执行完毕...");
}
}
java线程等待代码的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java等待线程池执行结束、java线程等待代码的信息别忘了在本站进行查找喔。







