Как использовать ожидание в потоках Java? - PullRequest
0 голосов
/ 06 марта 2019

Я работаю над реализацией параллелизма в Java. У меня есть два потока, один из которых будет считать до 20, а другой - с 20. Я хочу, чтобы первый поток завершился, а затем запустить второй. Я могу сделать это с помощью команды thread.sleep, но затем второй поток работает гораздо медленнее, чем первый. Есть ли способ запустить первый поток, а затем запустить второй поток с той же скоростью? Спасибо за любую помощь.

import java.lang.*;



public class threads extends Thread{

    public static void main(String[] args) {


        addition addrunner = new addition();
        addrunner.start();
        addrunner.setName("addition");

        subtraction subrun = new subtraction();
        subrun.setName("subtraction");
        subrun.start();
    }

}

class addition extends Thread{
    public void run() {

        for(int i = 0; i<=20; i++) {
            System.out.println("Number: " + i + " - Thread name is: " + Thread.currentThread().getName());

        }
    }
}


class subtraction extends Thread{
    public void run() {
        for(int i = 20; i>= 0; i--) {
            System.out.println("Number: " + i + " - Thread name is: " + Thread.currentThread().getName());
            try {
                Thread.sleep(800);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}

1 Ответ

0 голосов
/ 06 марта 2019

Вы можете удалить вызов Thread.sleep() во втором потоке subtraction, так как это неверный способ управления выполнением потока в вашем случае.

Вам нужно использовать Thread.join после запуска первого потока addition, чтобы поток main ожидал, пока поток addition не завершится полностью и только тогда поток subtraction будет запущен.

public class Threads extends Thread{
 public static void main(String[] args) {
        try {
            Addition addrunner = new Addition();
            addrunner.start();
            addrunner.setName("addition");
            addrunner.join(); //main thread waits here, until the addition thread has finished executing

            Subtraction subrun = new Subtraction();
            subrun.setName("subtraction");
            subrun.start();
        }catch (InterruptedException ie){
            ie.printStackTrace();
        }
    }
}

class Addition extends Thread{
    public void run() {

        for(int i = 0; i<=20; i++) {
            System.out.println("Number: " + i + " - Thread name is: " + Thread.currentThread().getName());

        }
    }
}


class Subtraction extends Thread{
    public void run() {
        for(int i = 20; i>= 0; i--) {
            System.out.println("Number: " + i + " - Thread name is: " + Thread.currentThread().getName());
        }
    }
}

Выход:

Number: 0 - Thread name is: addition
Number: 1 - Thread name is: addition
Number: 2 - Thread name is: addition
Number: 3 - Thread name is: addition
...
Number: 19 - Thread name is: addition
Number: 20 - Thread name is: addition


Number: 20 - Thread name is: subtraction
Number: 19 - Thread name is: subtraction
...
Number: 3 - Thread name is: subtraction
Number: 2 - Thread name is: subtraction
Number: 1 - Thread name is: subtraction
Number: 0 - Thread name is: subtraction
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...