Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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_Console - Fatal编程技术网

Java 与线程共享的控制台

Java 与线程共享的控制台,java,multithreading,console,Java,Multithreading,Console,我对java中的MT有一些简单的问题。我想同步控制台的访问。例如: 第一个线程写入System.out“1号”Thread2 printl(“2号”)。我想同步这个线程在控制台中顺序写入数字而不进行缓冲。这是怎么回事 Thread one Thread two Thread one Thread two ... //代码 package com.example; public class MyThread implements Runnable{ @Override synchroniz

我对java中的MT有一些简单的问题。我想同步控制台的访问。例如: 第一个线程写入System.out“1号”Thread2 printl(“2号”)。我想同步这个线程在控制台中顺序写入数字而不进行缓冲。这是怎么回事

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

    }
}
}

//

//

使用
队列
并将
字符串
添加到队列中。然后让一个专用线程从队列中取出并将其写入控制台。这将根据线程的队列访问创建FIFO顺序


如果您不想使用队列,您应该使用类似于令牌管理器的东西,在阻塞的线程之间切换。每个参与线程的
交换器
将是一个很好的起点。

我担心这是一个相当无用的问题,因为如果我们想要一个顺序,线程是相当无用的,但是,这里有一个解决方案:假设我们有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();
    }
}

线程本身的逻辑留给读者作为练习。

如果您对现有代码有问题,请发布其中一些。到目前为止你试过什么?另外,我不知道你为什么还要做这些,或者做一些学习练习。如果这是家庭作业,请把这个标签也添加到问题中,这样我们就知道只需给出提示。如果你想按顺序写,为什么要使用线程?这仅仅是一个有趣的问题吗?你需要两个线程交替吗?或者你需要任意数量的线程,而这个例子正好是两个?我想要阻塞线程并等待它访问console。这只是一个简单的例子。这并不能确保序列号被写入控制台。这个练习是线程之间的严格交替,每个线程在打印之间等待另一个线程。这取决于队列实现,但是对于2个线程,这可以使用
SynchronousQueue
user949300:Nope来完成,因为您无法确定线程调度。Touche-好的一点。我认为代码需要一个知道如何在线程之间严格交替的锁。
 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();
    }

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