Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.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

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 分别使用线程T1和T2打印奇数和偶数,如果出现素数,则按相反顺序打印_Java_Multithreading - Fatal编程技术网

Java 分别使用线程T1和T2打印奇数和偶数,如果出现素数,则按相反顺序打印

Java 分别使用线程T1和T2打印奇数和偶数,如果出现素数,则按相反顺序打印,java,multithreading,Java,Multithreading,我最近接受了摩根士丹利(Morgan Stanley)的采访,有人问我这个问题。我必须在线程T1运行时打印所有奇数,在线程T2运行时打印偶数,但是嘿!还有更多,如果出现任何素数,那么我必须颠倒顺序,即现在用T2表示奇数,用T1表示偶数 下面是我试过的,但那个家伙看着我,好像他想因为这个解决方案把我关进监狱。我是多线程新手。可能有一种方法可以使用notify()和wait()方法在多个线程之间建立通信来实现这一点。有人能把我带出监狱吗 public class MainClass extends

我最近接受了摩根士丹利(Morgan Stanley)的采访,有人问我这个问题。我必须在线程T1运行时打印所有奇数,在线程T2运行时打印偶数,但是嘿!还有更多,如果出现任何素数,那么我必须颠倒顺序,即现在用T2表示奇数,用T1表示偶数

下面是我试过的,但那个家伙看着我,好像他想因为这个解决方案把我关进监狱。我是多线程新手。可能有一种方法可以使用
notify()
wait()
方法在多个线程之间建立通信来实现这一点。有人能把我带出监狱吗

public class MainClass extends Thread {
    @Override
    public void run() {
        for(int i=0;i<20;i++) {
            String tname = Thread.currentThread().getName();
            if(isPrime(i)) {
                switch(tname) {
                    case "T2":
                        if(i%2 != 0)
                        System.out.println(tname + " - "+i);
                        break;
                    case "T1":
                        if(i%2 == 0)
                        System.out.println(tname + " - "+i);
                        break;
                    default:break;
                }
            }else {
                switch(tname) {
                    case "T1":
                        if(i%2 != 0)
                        System.out.println(tname + " - "+i);
                        break;
                    case "T2":
                        if(i%2 == 0)
                        System.out.println(tname + " - "+i);
                        break;
                    default:break;
                }
            }
        }
    }
    public boolean isPrime(int num) {
        if(num <= 1) return false;
        if(num == 2) return true;
        for(int i=2;i<=num/2;i++) {
            if(num%i == 0)
            return false;
        }
        return true;
    }
    public MainClass(String name) {
        super(name);
    }
    public static void main(String[] args) {
        MainClass t1 = new MainClass("T1");
        MainClass t2 = new MainClass("T2");
        t1.start();
        try {
            t1.join();//always keep it inside the try otherwise compile time error
        }catch(InterruptedException ie) {
            ie.printStackTrace();
        }
        t2.start();
    }
}

我会问面试官为什么要求你用两个线程来处理这几件事。为什么要一个接一个地运行这两个线程呢?可以缓存已经计算出的最大素数。然后在isPrime方法中,不启动i=2,而是启动i=biggestPrime。我认为还可以使用额外的线程引用变量evenThread和oddThread。您可以使用oddThread=T1和evenThread=T2来启动它们。当它是一个素数时,你只需要反转引用。然后你可以将开关块拉到if(isPrime())之外。@Andreas你能用我的代码的更好版本提供一个答案吗?
T1 - 1
T1 - 2
T1 - 9
T1 - 15
T2 - 0
T2 - 3
T2 - 4
T2 - 5
T2 - 6
T2 - 7
T2 - 8
T2 - 10
T2 - 11
T2 - 12
T2 - 13
T2 - 14
T2 - 16
T2 - 17
T2 - 18
T2 - 19