Java 使用线程同步的序列号
我想用n个线程打印一系列1到100个数字(让我们用10个线程)。条件是第一个线程的序列号为1、11、21…91,第二个线程的序列号为2、12、22…92,依此类推。所有其他线程都将具有这样的序列号。现在我想按顺序1到100打印数字。我知道我们可以使用同步、等待和通知方法,也可以使用变量或标志计数器,但我认为这不是一个好主意。我想在没有并发的情况下使用(如执行者等),我将如何做到这一点。请建议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
公共类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作为练习,您的问题肯定很有趣。但我希望您认识到,您要做的是序列化所有执行并使其有序,这与多线程的目的背道而驰。您发布的代码乍一看似乎与您所描述的相符;因此我真的不明白您的问题是什么。您有什么问题吗编译错误,或者某种错误?顺便说一下,三个线程不需要三个单独的类。