我有一个简单的程序,可以打印两个线程,交替增加数字。
所以, 第一个线程打印:1
第二个帖子打印:2
第一个主题打印:3 ...依此类推
我可以使用'Thread'类来执行此操作。但我想看看如何使用Executor类来做到这一点。
使用以下代码....执行器类似乎不起作用。任何指针??
代码:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class LocksPackagePractice {
private int i = 0;
ReentrantLock lock = new ReentrantLock();
Condition condition = lock.newCondition();
Runnable r = () -> {
for(int x = 0; x < 5; x++){
printValue();
}
printValue();
};
public static void main(String[] args) {
new LocksPackagePractice().trigger();
}
void trigger(){
ExecutorService service = Executors.newFixedThreadPool(2);
service.execute(r);
}
void printValue(){
lock.lock();
try {
i++;
System.out.println(Thread.currentThread().getName() + " and value is = " + i);
condition.signal();
condition.await();
} catch(InterruptedException e){
e.printStackTrace();
}finally {
lock.unlock();
}
}
}
答案 0 :(得分:3)
对您的计划进行了一些更改。运行它并检查它是否解决了混乱。
public class LocksPackagePractice {
private int i = 0;
ReentrantLock lock = new ReentrantLock();
Condition condition = lock.newCondition();
Runnable r = () -> {
printValue();
};
public static void main(String[] args) {
new LocksPackagePractice().trigger();
}
void trigger() {
ExecutorService service = Executors.newFixedThreadPool(2);
service.submit(r);
for (int i = 0; i < 5; i++) {
service.execute(r);
}
}
void printValue() {
lock.lock();
try {
i++;
System.out.println(Thread.currentThread().getName() + " and value is = " + i);
condition.signal();
condition.await();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}
这将为您提供以下输出
pool-1-thread-1 and value is = 1
pool-1-thread-2 and value is = 2
pool-1-thread-1 and value is = 3
pool-1-thread-2 and value is = 4
pool-1-thread-1 and value is = 5
pool-1-thread-2 and value is = 6
答案 1 :(得分:0)
我不确定,但您需要输入订购吗?因为您使用阻塞操作(锁定),并且在性能方面不佳。
此代码:
private AtomicInteger number = new AtomicInteger(0);
public static void main(String[] args) {
ExecutorService executor = Executors.newFixedThreadPool(2);
ForTestApplication testApplication = new ForTestApplication();
for (int i = 0; i < 100; i++) {
executor.execute(testApplication::print);
}
}
public void print () {
System.out.println(Thread.currentThread().getName() + " : " + number.incrementAndGet());
}
使用AtomicInteger
代替简单int
值和锁定操作。但输出顺序可能是这样的:
pool-1-thread-1 : 1
pool-1-thread-2 : 2
pool-1-thread-1 : 3
pool-1-thread-1 : 4
pool-1-thread-2 : 5
pool-1-thread-2 : 7
pool-1-thread-1 : 6
pool-1-thread-2 : 8
pool-1-thread-1 : 9
pool-1-thread-2 : 10
您需要在输出中订购,然后需要考虑如何处理它。