线程2等待线程1完成启动问题?爪哇

时间:2020-04-04 15:38:22

标签: java multithreading thread-sleep

所以我有一个简单的代码,我想用Thread1将值I打印10次,在Thread2的10次之后,最后打印计数(应该为20)。我正在使用“ .join()”,但结果是执行Thread1和Thread2的随机时间,然后总和是正确的。怎么可能先打印所有的Thread's1循环,然后再打印Tread's2?

class MyClass extends Thread {  

     public static synchronized void incount() {
         SimpleThreads.count++;
     } 
        public void run() { 

            for(int i=0; i<10; i++) { 
                    incount();  
                    System.out.println(Thread.currentThread().getId()+" value : " + i);
            }
        }           
    }

public class SimpleThreads {

     static int count=0;

    public static void main(String[] args) {

        MyClass thread1 =new MyClass();
        MyClass thread2 =new MyClass();

        thread1.start(); 
        thread2.start();
        try {
            thread1.join();
            thread2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println(" Sum : "+count);
    }
}

结果:

11 value : 0
10 value : 1
11 value : 1
10 value : 2
11 value : 2
10 value : 3
11 value : 3
11 value : 4
11 value : 5
11 value : 6
11 value : 7
11 value : 8
11 value : 9
10 value : 4
10 value : 5
10 value : 6
10 value : 7
10 value : 8
10 value : 9
 Sum : 20

2 个答案:

答案 0 :(得分:3)

您正在启动p,然后再在p <- structure(list(contra.pos = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 2L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = c("Ipsi.", "Contra."), class = "factor"), ecs = structure(c(1L, 1L, 1L, 2L, 1L, 1L, 2L, 1L, 1L, 1L, 2L, 2L, 2L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 2L, 2L, 1L, 2L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 2L, 2L, 1L, 1L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 2L, 2L, 2L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 2L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 2L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 2L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 1L, 1L, 1L, 2L, 2L, 1L, 1L, 1L, 2L, 1L, 1L, 2L, 1L, 1L, 1L, 2L, 1L, 2L, 2L, 2L, 1L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L ), .Label = c("No", "Yes"), class = "factor"), n_fjernet = c(22L, 61L, 50L, 47L, 30L, 60L, 82L, 60L, 33L, 67L, 35L, 56L, 15L, 37L, 44L, 124L, 41L, 30L, 31L, 35L, 36L, 28L, 39L, 54L, 25L, 27L, 69L, 53L, 24L, 33L, 52L, 77L, 51L, 7L, 22L, 53L, 26L, 58L, 28L, 83L, 39L, 15L, 37L, 27L, 9L, 17L, 32L, 26L, 44L, 52L, 22L, 62L, 53L, 68L, 52L, 38L, 50L, 21L, 41L, 74L, 15L, 26L, 36L, 37L, 34L, 22L, 31L, 53L, 13L, 44L, 43L, 51L, 20L, 21L, 63L, 40L, 25L, 17L, 43L, 47L, 35L, 21L, 4L, 23L, 35L, 50L, 69L, 24L, 38L, 45L, 37L, 35L, 25L, 19L, 43L, 19L, 33L, 38L, 50L, 21L, 40L, 100L, 45L, 53L, 41L, 7L, 75L, 48L, 20L, 11L, 72L, 37L, 34L, 70L, 20L, 47L, 44L, 45L, 48L, 23L, 27L, 24L, 39L, 9L, 34L, 22L, 89L, 40L, 35L, 34L, 61L, 28L, 27L, 62L, 47L, 13L, 20L, 9L, 27L, 38L, 44L, 15L, 33L, 65L, 31L, 49L, 53L, 15L, 26L, 17L, 24L, 20L, 25L, 12L, 34L, 22L, 27L, 14L, 27L, 31L, 26L, 15L, 16L, 30L, 19L, 51L, 12L, 33L, 68L, 26L, 20L, 34L, 31L, 7L, 76L, 7L, 24L, 36L, 22L, 27L, 35L, 64L, 18L, 38L, 10L, 27L, 26L, 47L, 15L, 30L, 30L, 21L, 31L, 14L, 14L, 22L, 28L, 13L, 17L, 16L, 7L, 11L, 37L, 55L, 13L, 26L, 17L, 12L, 44L, 58L, 20L, 28L, 7L, 24L, 10L, 42L, 39L, 14L, 31L, 49L, 87L, 18L, 26L, 24L, 20L, 41L, 31L, 13L, 41L, 25L, 16L, 18L, 26L, 35L, 36L, 22L, 20L, 16L, 10L, 19L, 46L, 6L, 49L, 70L, 46L, 55L, 25L, 22L, 37L, 28L), n_sygdom = c(1L, 2L, 1L, 3L, 1L, 0L, 3L, 0L, 2L, 1L, 4L, 4L, 1L, 0L, 2L, 2L, 1L, 0L, 0L, 4L, 0L, 0L, 1L, 1L, 0L, 1L, 4L, 3L, 1L, 0L, 8L, 1L, 1L, 1L, 1L, 1L, 0L, 1L, 2L, 1L, 0L, 2L, 1L, 0L, 2L, 0L, 3L, 0L, 1L, 1L, 1L, 2L, 0L, 3L, 2L, 1L, 0L, 0L, 0L, 2L, 0L, 3L, 0L, 0L, 0L, 1L, 1L, 0L, 0L, 1L, 4L, 0L, 0L, 2L, 2L, 1L, 1L, 0L, 0L, 3L, 1L, 6L, 0L, 0L, 0L, 3L, 2L, 2L, 4L, 0L, 3L, 27L, 0L, 2L, 1L, 0L, 0L, 1L, 1L, 2L, 2L, 5L, 1L, 0L, 0L, 1L, 0L, 5L, 0L, 0L, 2L, 10L, 0L, 6L, 2L, 1L, 2L, 0L, 0L, 0L, 0L, 4L, 0L, 0L, 1L, 5L, 2L, 2L, 1L, 2L, 1L, 0L, 0L, 1L, 13L, 0L, 1L, 0L, 1L, 0L, 1L, 1L, 0L, 23L, 0L, 2L, 2L, 0L, 2L, 0L, 0L, 1L, 1L, 0L, 0L, 0L, 2L, 3L, 1L, 4L, 0L, 1L, 0L, 5L, 5L, 4L, 0L, 0L, 4L, 0L, 1L, 1L, 0L, 2L, 5L, 1L, 3L, 6L, 1L, 1L, 1L, 0L, 0L, 1L, 1L, 0L, 0L, 1L, 0L, 0L, 0L, 1L, 0L, 1L, 2L, 0L, 1L, 1L, 0L, 0L, 0L, 1L, 1L, 0L, 1L, 1L, 1L, 0L, 40L, 2L, 0L, 1L, 0L, 2L, 0L, 3L, 1L, 1L, 4L, 1L, 2L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), score = c(47.2, 47.5, 39.3, 72.2, 44.9, 25.7, 62.4, 25.7, 55.4, 34.5, 82.3, 76.4, 60.6, 32.2, 52.3, 36.1, 41.8, 34.2, 33.9, 65.7, 32.5, 34.8, 42.4, 38.1, 35.6, 45.8, 61.2, 59, 46.6, 33.4, 84, 26.5, 39, 62.9, 47.2, 38.4, 35.3, 37, 56.9, 30, 31.7, 60.5, 42.9, 35, 62.2, 37.9, 65, 35.3, 41, 38.7, 47.2, 58.8, 27.7, 54.8, 50.1, 42.7, 28.6, 36.7, 31.1, 43.9, 38.4, 78.1, 32.5, 32.2, 33.1, 47.2, 44.6, 27.7, 39, 41, 68.6, 28.3, 37, 58.8, 58.5, 42.1, 46.3, 37.9, 30.5, 60.7, 55, 77.5, 41.5, 36.2, 32.8, 71.4, 56.8, 58, 76.3, 30, 63.5, 123.9, 35.6, 59.4, 41.2, 37.3, 33.4, 37.5, 39.3, 58.8, 53.5, 52, 35.5, 27.7, 31.1, 51.4, 21.5, 83.3, 37, 39.6, 50.8, 91.4, 33.1, 63.7, 70.6, 51.6, 52.3, 30, 29.1, 36.2, 35, 85.4, 31.7, 40.1, 55.3, 90.7, 51.2, 53.5, 43.5, 55.2, 47.7, 34.8, 35, 35.9, 98.5, 39, 59.2, 40.1, 57.3, 31.9, 52.5, 49.1, 33.4, 92.5, 33.9, 50.9, 49.8, 38.4, 57.4, 37.9, 35.9, 47.7, 57.8, 39.3, 33.1, 36.5, 57.1, 70, 57.3, 71.9, 35.3, 60.6, 38.1, 71.8, 91.5, 61.2, 39.3, 33.4, 56.4, 35.3, 47.7, 43.8, 33.9, 62.8, 75.4, 51.4, 78.7, 78.4, 47.2, 45.8, 55, 24.6, 37.6, 42.7, 62, 35, 35.3, 51.6, 38.4, 34.2, 34.2, 42.3, 33.9, 49.4, 60.8, 36.5, 57, 61.2, 37.9, 38.1, 40.7, 61.8, 54.4, 27.1, 49.7, 46, 60.1, 39.3, 130.2, 59.9, 37, 40.3, 40.7, 69.5, 39.8, 73.6, 53.9, 60.9, 71.9, 51.1, 51.7, 37.6, 35.3, 35.9, 37, 31.1, 33.9, 39, 31.1, 35.6, 38.1, 37.6, 35.3, 32.8, 32.5, 36.5, 37, 38.1, 39.8, 37.3, 29.7, 41, 28.8, 22.9, 29.7, 27.1, 35.6, 36.5, 32.2, 34.8)), row.names = c(NA, 250L), class = "data.frame") 上调用Thread2。 这就是为什么您的两个线程基本上同时运行并且您的联接不影响其他两个线程的join()的原因。

尝试更改您的开始并将调用代码加入类似这样的内容;

thread1

在这种情况下,您不需要在线程2上调用run()

答案 1 :(得分:2)

如果您希望thread2thread1终止后开始,那么当然可以简单地等待thread1终止然后启动thread2。但是,使用线程有什么意义呢?

如果您要同时启动thread1thread2,并且仍然有thread2等到thread1终止,则可以使用Java的众多{{3 }},例如concurrency utilities

以下代码演示了Semaphore的用法。如您所见,就像您问题中的代码一样,两个线程-thread1thread2-同时启动。在类run()的{​​{1}}方法中,代码尝试获取信号量。方法MyClass将阻塞,即直到成功获取信号量后才返回。因此,设法获取信号量的第一个线程将运行,而另一个线程将等待,直到第一个线程释放信号量。请注意,我仅使用一个许可来创建信号灯,这意味着在任何时候只有一个线程可以获取该信号灯。如果在对acquire()构造函数的调用中将1更改为2,您将获得与问题中原始代码完全相同的行为,即两个线程将同时运行因为两者都可以立即获得信号量。

还要注意,由于我使用的是信号量,因此我根本不需要调用Semaphore来让一个线程等待另一线程完成,但是由于要在其中打印“ sum” “主”线程,“主”线程需要等待,但只需要等待第二个线程终止即可。

代码如下:

Thread.join()

这是运行上面的代码时获得的输出:

import java.util.concurrent.Semaphore;

class MyClass extends Thread {
    private Semaphore semaphore;

    public MyClass(Semaphore semaphore) {
        this.semaphore = semaphore;
    }

    public static synchronized void incount() {
        SimpleThreads.count++;
    }

    public void run() {
        try {
            semaphore.acquire();
            for (int i = 0; i < 10; i++) {
                incount();
                System.out.println(Thread.currentThread().getId() + " value : " + i);
            }
        }
        catch (InterruptedException xInterrupted) {
            xInterrupted.printStackTrace();
        }
        finally {
            semaphore.release();
        }
    }
}

public class SimpleThreads {

    static int count = 0;

    public static void main(String[] args) {
        Semaphore semaphore = new Semaphore(1);

        MyClass thread1 = new MyClass(semaphore);
        MyClass thread2 = new MyClass(semaphore);

        thread1.start();
        thread2.start();
        try {
            thread2.join();
        }
        catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(" Sum : " + count);
    }
}