1.题目要求:自定义一个线程,创建三个实例,功能是打印1~100的数字。
其中,数字1+3*n(n>=0)必须是第一个线程实例打印的,2+3*n必须是第二个实例打印,3+3*n必须是第三个线程打印,打印结果严格递增,实例1,2,3依次轮流打印。
2.代码:
public class Printer implements Runnable { int i = 1; public void run() { try { synchronized (this) { while (i <= 100) { String threadNo = Thread.currentThread().getName(); while (i % 3 != Integer.valueOf(threadNo) % 3) { this.wait(); } if (i <= 100) System.out.println(threadNo + ": " + i++); this.notifyAll(); } } } catch (InterruptedException e) { System.out.println("InterruptedException occur"); } } } public class Start { public static void main(String[] args) { Printer printer = new Printer(); Thread t1 = new Thread(printer,"1"); Thread t2 = new Thread(printer,"2"); Thread t3 = new Thread(printer,"3"); t1.start(); t2.start(); t3.start(); } }
代码2:
来个简单粗暴无同步的代码
package cn.byr.nuanyangyang.jishuqi;
class PrintingContext {
public volatile int current = 1;
}
class Printer implements Runnable {
private PrintingContext ctx;
private String name;
private int modulo;
public Printer(PrintingContext ctx, String name, int modulo) {
this.ctx = ctx;
this.name = name;
this.modulo = modulo;
}
@Override
public void run() {
while (true) {
int cur = ctx.current;
if (cur > 100) {
break;
}
if (cur % 3 == modulo) {
System.out.format("[%s] %d
", name, cur);
int newNum = cur + 1;
ctx.current = newNum;
}
}
}
}
public class MangDengDaiJiShuQi {
public static void main(String[] args) throws Exception {
PrintingContext ctx = new PrintingContext();
Printer p1 = new Printer(ctx, "Printer 1", 1);
Printer p2 = new Printer(ctx, "Printer 2", 2);
Printer p3 = new Printer(ctx, "Printer 3", 0);
Thread t1 = new Thread(p1);
Thread t2 = new Thread(p2);
Thread t3 = new Thread(p3);
long timeStamp1 = System.currentTimeMillis();
t1.start();
t2.start();
t3.start();
t1.join();
t2.join();
t3.join();
long timeStamp2 = System.currentTimeMillis();
System.out.format("Total time: %dms", timeStamp2 - timeStamp1);
}
}
|
|