Консоль поделилась с Нитью - PullRequest
0 голосов
/ 10 декабря 2011

У меня простые проблемы с MT в Java. Мне нравится синхронизировать доступ к консоли. Пример: Первый поток записать в System.out «Номер один» Thread2 printl («Номер два»). Я хотел бы синхронизировать этот поток записи последовательно в консоли без буферизации. Как это сделать?

Thread one
Thread two
Thread one
Thread two
...

// Код

package com.example;

public class MyThread implements Runnable{


@Override
synchronized public void run(){
    while(true){
        System.out.println("Thread first");

    }
}

}

//

package com.example;

public class MyThread2 implements Runnable {


@Override
synchronized public void run() {
    // TODO Auto-generated method stub
    System.out.println("");

}

}

//

 package com.example;

import java.util.concurrent.Semaphore;

public class Main {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub

Thread th1= new Thread(new MyThread());
Thread th2= new Thread(new MyThread2());

th2.setPriority(Thread.MAX_PRIORITY);
th1.start();
th2.start();
    }

}

Ответы [ 2 ]

2 голосов
/ 10 декабря 2011

Ну, я боюсь, что это довольно бесполезный вопрос, потому что если мы хотим, чтобы последовательное упорядочение потоков было бесполезным, ну да, вот одно из решений: предположим, у нас N потоков.

В теме 0 следует записать числа 0, N, 2N, 3N, ..

В теме 1 следует написать число 1, N + 1, 2N + 1, 3N + 1

хорошо, вы получаете образец. Как это сделать? Достаточно просто, нам в основном нужен метод, который ждет, пока наша очередь писать. Реальное простое решение со статическими объектами для простоты:

private static volatile int globalVal = 0;
private static Object lock = new Object();

public void writeInt(int val) {
    synchronized(lock) {
        while (globalVal != val) {
            try {
                lock.wait();
            }
            catch(InterruptedException e) {
            }
        }
        System.out.println(val);
        globalVal++;
        lock.notifyAll();
    }
}

логика в самих потоках оставлена ​​читателю в качестве упражнения.

0 голосов
/ 10 декабря 2011

Используйте Queue<String> и добавьте String s в очередь.Затем выделите выделенный поток из очереди и запишите его на консоль.Это создаст порядок FIFO, основанный на доступе к очереди потоков.

Если вы не хотите использовать очереди, вам нужно что-то вроде менеджера токенов, который переключается через заблокированные потоки.Exchanger<V> для каждого участвующего потока будет хорошей отправной точкой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...