Java 使螺纹以正确的方式工作
我刚开始学习线程,对线程的工作原理产生了误解 这是我的班级:Java 使螺纹以正确的方式工作,java,multithreading,concurrency,Java,Multithreading,Concurrency,我刚开始学习线程,对线程的工作原理产生了误解 这是我的班级: public class MyThread extends Thread { private static int NUM = 0; private int id; public MyThread() { id = NUM++; } public static void main(String[] args) { for (int i = 0; i <
public class MyThread extends Thread {
private static int NUM = 0;
private int id;
public MyThread() {
id = NUM++;
}
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
new MyThread().start();
}
}
public void run() {
System.out.println(id + " started");
try {
Process p = Runtime.getRuntime().exec("javac -version");
p.waitFor();
} catch (Exception e) {
System.out.println("Call a doc!");
}
System.out.println(id + " finished");
}
}
/*
Just a sidenote.
I am creating new javac process just to slow an application down.
Simple System.out.println(…) is a way faster.
*/
线程的目的不是并行执行吗?也许我需要同步一些东西?还是犯了粗心的错误?或者…?
请解释一下 更新: 为什么我不明白,比如说:
0 started
1 started
0 finished
2 started
1 finished
2 finished
谢谢大家的治疗。线程是平行的。否则,您将看到每个线程在下一个线程“开始”之前“完成” 减慢线程速度的一个简单方法是使用thread.sleep(10*1000);睡眠10秒(10000毫秒) 编辑:查看线程交错的一个简单方法是拥有一个固定大小的线程池
ExecutorService pool = Executors.newFixedThreadPool(4);
for (int i = 0; i < 10; i++) {
final int id = i;
pool.submit(new Callable<Void>() {
public Void call() throws InterruptedException {
System.out.println(id + " started");
Thread.sleep(1000);
System.out.println(id + " finished");
return null;
}
});
}
看起来不错。您可以从输出中看到线程是交错的。线程正在启动,得到上下文切换,并被调度程序选中,例如,您可以看到线程8跳到线程5之前的位置。如果所有的数字都是顺序一致的,这将是奇怪的,但这似乎很好
使用睡眠时间,就像Peter Lawrey建议的那样,这样你就可以更容易地改变每条线程所需的时间。正如您的示例所示,启动一个进程需要花费大量时间,因此在任何结束之前都应该启动所有线程似乎是合理的。如果在run()方法中放置一个简单的循环,从1到20计数,您可能会更好地看到执行的交错。这两种方法之间存在差异。。。看看这个…如果你想看到一个“随机”的开始和结束,你可能想添加一个
Thread.sleep(new Random().nextInt(1000));
或者类似于线程。是的,它们是并行的,但我猜他是在问为什么,如果他创建了数百个线程,在主循环中没有一个线程完成。你尽可能快地启动线程,不会有延迟。每个线程的执行时间要长得多,所以它们都会在第一个线程完成之前启动。你的英语很好。好问题。
0 started
1 started
2 started
3 started
0 finished
4 started
1 finished
5 started
2 finished
6 started
3 finished
7 started
4 finished
8 started
5 finished
6 finished
9 started
7 finished
8 finished
9 finished
Thread.sleep(new Random().nextInt(1000));