Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.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 - Fatal编程技术网

Java线程:如何同时执行语句

Java线程:如何同时执行语句,java,multithreading,Java,Multithreading,假设我有一个如下所示的run方法,我正在尝试为MyThread创建四个线程。语句1到3可以由线程同时运行,也可以以不同方式运行。但我希望语句4由线程同时执行。我可以在语句4之前汇集所有线程,并由所有线程同时执行语句4吗 class MyThread extends Thread { public void run() { //Statement 1 //Statement 2 //Statement 3 //Statement 4

假设我有一个如下所示的run方法,我正在尝试为MyThread创建四个线程。语句1到3可以由线程同时运行,也可以以不同方式运行。但我希望语句4由线程同时执行。我可以在语句4之前汇集所有线程,并由所有线程同时执行语句4吗

class MyThread extends Thread
{ 
    public void run()
    {
        //Statement 1
    //Statement 2
    //Statement 3
    //Statement 4
    }

}

有几种方法可以满足您的需求。也许最简单的方法是使用Java的实现。您可以定义一个(或多个)未来,它将在单独的线程上执行,阻塞直到它们全部完成,然后根据结果完成其他任务

有几种方法可以做你想做的事。也许最简单的方法是使用Java的实现。您可以定义一个(或多个)未来,它将在单独的线程上执行,阻塞直到它们全部完成,然后根据结果完成其他任务

使用CyclicBarrier,它最适合您的需求

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

public class CyclicBarrierUsage {

    private static final int NUMBER_OF_THREADS = 2;

    public static void main(String[] args) {
        CyclicBarrier barrier = new CyclicBarrier(NUMBER_OF_THREADS);

        Thread t1 = new Thread(new PrimaryParty(barrier));
        Thread t2 = new Thread(new PrimaryParty(barrier));

        t1.start();
        t2.start();    
    }
}

class PrimaryParty implements Runnable {

    private CyclicBarrier barrier;

    public PrimaryParty(CyclicBarrier barrier) {
        this.barrier = barrier;
    }

    @Override
    public void run() {
        //Statement 1
        //Statement 2
        //Statement 3

        try {
            barrier.await();
        } catch (InterruptedException | BrokenBarrierException e) {
            e.printStackTrace();
        }

        //Statement 4
    }
}

使用CyclicBarrier,它最适合您的要求

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

public class CyclicBarrierUsage {

    private static final int NUMBER_OF_THREADS = 2;

    public static void main(String[] args) {
        CyclicBarrier barrier = new CyclicBarrier(NUMBER_OF_THREADS);

        Thread t1 = new Thread(new PrimaryParty(barrier));
        Thread t2 = new Thread(new PrimaryParty(barrier));

        t1.start();
        t2.start();    
    }
}

class PrimaryParty implements Runnable {

    private CyclicBarrier barrier;

    public PrimaryParty(CyclicBarrier barrier) {
        this.barrier = barrier;
    }

    @Override
    public void run() {
        //Statement 1
        //Statement 2
        //Statement 3

        try {
            barrier.await();
        } catch (InterruptedException | BrokenBarrierException e) {
            e.printStackTrace();
        }

        //Statement 4
    }
}

我认为您对Java中的线程、并发性和同步有很大的误解。我会推荐你的。我现在能给你的唯一“答案”是预焙代码,你可以直接复制粘贴,但是你不会学到任何东西。是的,你可以。一种方法是使用类。创建一个计数为3的语句,在前三个线程的末尾倒数,然后等待第四个线程的计数达到零。你的意思是说,在所有线程都完成语句3之前,你不希望任何线程启动语句4吗?是的@DavidSchwartzI认为你对线程有很大的误解,Java中的并发和同步。我会推荐你的。我现在能给你的唯一“答案”是预焙代码,你可以直接复制粘贴,但是你不会学到任何东西。是的,你可以。一种方法是使用类。使用计数3创建它,在前三个线程中的每一个线程结束时倒计时,并等待它在第四个线程中达到零。您的意思是,在所有线程都完成语句3之前,您不希望任何线程启动语句4吗?是@DavidSchwartzThank you@PardeepDogra。它在示例项目中工作。让我试试实施。谢谢@PardeepDogra。它在示例项目中工作。让我试试。