使用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高并发编程详解:多线程与架构设计(汪文君 著)》

上一篇下一篇

猜你喜欢

热点阅读