Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.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_Synchronized - Fatal编程技术网

Java 使用线程同步的序列号

Java 使用线程同步的序列号,java,multithreading,synchronized,Java,Multithreading,Synchronized,我想用n个线程打印一系列1到100个数字(让我们用10个线程)。条件是第一个线程的序列号为1、11、21…91,第二个线程的序列号为2、12、22…92,依此类推。所有其他线程都将具有这样的序列号。现在我想按顺序1到100打印数字。我知道我们可以使用同步、等待和通知方法,也可以使用变量或标志计数器,但我认为这不是一个好主意。我想在没有并发的情况下使用(如执行者等),我将如何做到这一点。请建议 公共类PrintNumberSequenceUsingRunnable{ int值=1; 公共静态voi

我想用n个线程打印一系列1到100个数字(让我们用10个线程)。条件是第一个线程的序列号为1、11、21…91,第二个线程的序列号为2、12、22…92,依此类推。所有其他线程都将具有这样的序列号。现在我想按顺序1到100打印数字。我知道我们可以使用同步、等待和通知方法,也可以使用变量或标志计数器,但我认为这不是一个好主意。我想在没有并发的情况下使用(如执行者等),我将如何做到这一点。请建议

公共类PrintNumberSequenceUsingRunnable{
int值=1;
公共静态void main(字符串[]args){
PrintNumberSequenceUsingRunnable序列=新的PrintNumberSequenceUsingRunnable();
螺纹f=新螺纹(新的第一个(顺序),“第一个”);
螺纹s=新螺纹(新的第二个(序列),“第二个”);
螺纹t=新螺纹(新的第三个(顺序),“第三个”);
f、 start();
s、 start();
t、 start();
}
}
类首先实现可运行的{
PrintNumberSequenceUsingRunnable序列;
公共优先(PrintNumberSequenceUsingRunnable序列){
这个序列=序列;
}
@凌驾
公开募捐{
printFist();
}
私有void printFist(){
已同步(序列){

对于(int i=1;i您需要在每个线程上对值进行排序。每次线程写入一个数字时,它都会在事件总线中触发一个事件。所有线程都订阅了该事件

通过触发事件[最小值-1]启动系统

每个线程都将收到一个通知,通知值[minimum value-1]已发布。只有具有值[minimum value]的线程才会执行操作并触发值[minimum value+1]的新事件

编辑:我还没有测试过,但是类似这样的东西

static void main(String[] args) {
    List<Deque<Integer>> publishQueues = new ArrayList<>();
    for (int i = 1; i <= 10; i++) {
        new Thread(new Worker(i, publishQueues)).start();
    }
}

class Worker implements Runnable {
    Deque subscriberQueue;
    List<Deque<Integer>> publishQueues;
    int i;
    Worker(int i, List<Deque<Integer>> publishQueues) {
        this.i = i;
        this.publishQueues = publishQueues;
        this.subscriberQueue = new ConcurrentLinkedDeque<>();
        this.publishQueues.add(this.subscriberQueue);
    }

    void Run() {
        LinkedList<Integer> ints = new LinkedList<>();
        for (int j = i; j <= 100; j+=10) {
            ints.add(j);
        }

        while (true) {
            Integer publishedInteger = subscriberQueue.poll();
            if (publishedInteger == ints.getFirst() - 1) {
                Integer integer = ints.poll();
                System.out.println(integer);
                for (Dequeu<Integer> publishQueue : publishQueues) {
                    publishQueue.addLast(integer);
                }
            }
        }
    }
}
static void main(字符串[]args){
List publishQueues=new ArrayList();

对于(int i=1;i作为练习,您的问题肯定很有趣。但我希望您认识到,您要做的是序列化所有执行并使其有序,这与多线程的目的背道而驰。您发布的代码乍一看似乎与您所描述的相符;因此我真的不明白您的问题是什么。您有什么问题吗编译错误,或者某种错误?顺便说一下,三个线程不需要三个单独的类。