今天看到了一道题:
三个线程分别打印A,B,C,要求这三个线程一起运行,打印n次,输出形如“ABCABCABC....”的字符串
由于本人没有开发过关于多线程的项目,所以对线程的了解,更多的偏向于网络资料以及个人理解!
以我的角度来说,线程排序打印,三种方式:
1、用join方法,强行让线程加入运行行列:
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
try {
System.out.print("A");
} catch (Exception e) {
e.printStackTrace();
}
}
});
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
try {
System.out.print("B");
} catch (Exception e) {
e.printStackTrace();
}
}
});
Thread t3 = new Thread(new Runnable() {
@Override
public void run() {
try {
System.out.print("C");
} catch (Exception e) {
// TODO: handle exception
}
}
});
t1.start();
t1.join();
t2.start();
t2.join();
t3.start();
t3.join();
2、借于https://blog.csdn.net/zy90101...,concurrent包里面有个CountDownLatch计数器,这里面有2个方法:c.countDown():作用是计数器减1,c1.await(),如果计数器暂时没有到0,则阻塞线程。
CountDownLatch c1 = new CountDownLatch(1);
CountDownLatch c2 = new CountDownLatch(1);
CountDownLatch call = new CountDownLatch(3);
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
try {
c2.await();
System.out.println("A");
call.countDown();
}catch (Exception e){
e.printStackTrace();
}
}
});
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
try {
c1.await();
System.out.println("B");
c2.countDown();
call.countDown();
}catch (Exception e){
e.printStackTrace();
}
}
});
Thread t3 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("C");
c1.countDown();
call.countDown();
}
});
t1.start();
t2.start();
t3.start();
try {
call.await();
}catch (Exception e){
e.printStackTrace();
}
3、用线程池:
static ExecutorService executors = Executors.newSingleThreadExecutor();
public static void main(String[] args){
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
try {
System.out.print("A");
} catch (Exception e) {
e.printStackTrace();
}
}
});
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
try {
System.out.print("B");
} catch (Exception e) {
e.printStackTrace();
}
}
});
Thread t3 = new Thread(new Runnable() {
@Override
public void run() {
try {
System.out.print("C");
} catch (Exception e) {
// TODO: handle exception
}
}
});
for (int i = 0; i < 10; i++) {
executors.submit(new Thread(t1));
executors.submit(new Thread(t2));
executors.submit(new Thread(t3));
}
executors.shutdown();
总结:不做循环打印的话,三种都可以实现!唯独第三种实现了循环打印,我实力有限,而且借此机会对线程的运用多了一些理解!只是个人记录,做备忘用而已
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。