使用Java的匿名内部类创建单个线程和多个线程的代码
2020-11-10 本文已影响0人
希望是水户洋平
适用场景
用匿名内部类或者lambda表达式创建的线程的优点是简洁方便,但是因为没有生产具体的对象实例(如下列代码中的t1,t2),所以用匿名内部类或者lambda表达式创建的线程只适用于该线程只使用一次的情况。
Thread t1 = new Thread(blt::syncMethod, "T1");
Thread t2 = new Thread(blt::otherFunction, "T2");
具体例子
在明白适用场景之后,就可以愉快地敲代码了。首先是用匿名内部类或lambda表达式创建单个线程的代码的例子:
//匿名内部类写法
new Thread() {
@Override
public void run() {
//do some thing
}
, "ThreadName"}.start();
//lambda表达式的写法
//例1
new Thread(TryConcurrency::enjoy)..start();
//例2
new Thread(() -> {
for (; ; ) {
try {
myEventQueue.take();
TimeUnit.MILLISECONDS.sleep(15); //假设客户端提交event几乎
// 不消耗时间,而消费event相比需要更多时间。
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}, "Consumer" ).start();
创建多个线程的写法:加个循环或用JDK8引入的Stream特性。一般而言for循环代码可读性比较强,使用Stream特性的话代码简洁但可读性受损。
//用for循环创建多个线程的例子,创建了10个线程
for (int i = 0; i < 10; i++) {
new Thread(() -> {
for (; ; ) {
try {
myEventQueue.take();
TimeUnit.MILLISECONDS.sleep(15); //假设客户端提交event几乎
// 不消耗时间,而消费event相比需要更多时间。
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}, "Consumer_" + i).start();
}
//这是使用JDK8的Stream新特性来创造多个新的线程,创建了10个线程
IntStream.range(0,10)
.mapToObj(i -> new Thread(blt::syncMethod))
.forEach(Thread::start);
参考书籍:《Java高并发编程详解:多线程与架构设计(汪文君 著)》