Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使螺纹以正确的方式工作_Java_Multithreading_Concurrency - Fatal编程技术网

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));