java两线程交替打印奇偶数
2021-04-01 15:28
标签:-o span interrupt 实验 tar while read thread static 方法1:synchronized 方法2:ReentrantLock 对 0-99999 做三次实验耗时: 方法1:1395, 1393, 1432 方法2:1387, 1550, 1552 方法1控制台不打印:24, 24, 24 方法2控制台不打印:137, 139, 155 结论: 在当前实验中,synchronized 比 ReentrantLock 性能好 完整代码: java两线程交替打印奇偶数 标签:-o span interrupt 实验 tar while read thread static 原文地址:https://www.cnblogs.com/GY8023/p/13553469.htmlclass Odd implements Runnable {
@Override
public void run() {
while(idx len){
synchronized (lock){
if (idx > 1 num[idx]){
System.out.print(num[idx]);
System.out.println("--Odd");
++idx;
}
}
}
}
}
class Even implements Runnable {
@Override
public void run() {
while(idx len){
synchronized (lock){
if (idx > 1 num[idx]){
System.out.print(num[idx]);
System.out.println("--Even");
++idx;
}
}
}
}
}
class Odd implements Runnable {
@Override
public void run() {
while(idx len){
rlock.lock();
if (idx > 1 num[idx]){
System.out.print(num[idx]);
System.out.println("--Odd");
++idx;
}
rlock.unlock();
}
}
}
class Even implements Runnable {
@Override
public void run() {
while(idx len){
rlock.lock();
if (idx > 1 num[idx]){
System.out.print(num[idx]);
System.out.println("--Even");
++idx;
}
rlock.unlock();
}
}
}
public class OddEven {
int len;
int[] num;
int idx = 0;
final Boolean lock = false;
ReentrantLock rlock = new ReentrantLock();
public OddEven(int len) {
this.len = len;
num = new int[len];
for (int i = 0; i ) {
num[i] = i;
}
idx = 0;
}
class Odd implements Runnable {
@Override
public void run() {
while(idx len){
// synchronized (lock){
// if (idx > 1
//// System.out.print(num[idx]);
//// System.out.println("--Odd");
// ++idx;
// }
// }
rlock.lock();
if (idx > 1 num[idx]){
System.out.print(num[idx]);
System.out.println("--Odd");
++idx;
}
rlock.unlock();
}
}
}
class Even implements Runnable {
@Override
public void run() {
while(idx len){
// synchronized (lock){
// if (idx > 1 // System.out.print(num[idx]);
// System.out.println("--Even");
// ++idx;
// }
// }
rlock.lock();
if (idx > 1 num[idx]){
System.out.print(num[idx]);
System.out.println("--Even");
++idx;
}
rlock.unlock();
}
}
}
public void execute() {
long begin = System.currentTimeMillis();
Thread odd = new Thread(new Odd());
Thread even = new Thread(new Even());
odd.start();
even.start();
try {
odd.join();
even.join();
} catch (InterruptedException e) {
e.printStackTrace();
System.out.println("被打断");
}
long end = System.currentTimeMillis();
System.out.println("\ntotal time: " + (end - begin));
}
public static void main(String[] args) {
OddEven oe = new OddEven(100000);
oe.execute();
}
}