java面试第1弹——线程的创建方式

❤关注点赞加收藏,编程一路不迷茫^_^

方式1、继承Thread类,覆盖(override)run方法

例子

package com.esoon.thread.threadImplementation.extendThread;

public class ExtendThreadTest {
    public static void main(String[] args) {
        ExtendThread extendThread = new ExtendThread();
        extendThread.start();
    }
}

class ExtendThread extends Thread {
    @Override
    public void run() {
        System.out.println("burns extendThread");
    }
}

注意:启动线程是调用start方法,这样会创建一个新的线程,并执行线程的任务
如果直接调用run方法,这样会让当前线程执行run方法中的业务逻辑

方式二、实现Runnable接口,实现run方法

例子

package com.esoon.thread.threadImplementation.extendThread;

public class ImplementRunnableTest {
    public static void main(String[] args) {
        MyImplementRunnableClass myImplementRunnableClass = new MyImplementRunnableClass();
        Thread MyImplementRunnableClassThread = new Thread(myImplementRunnableClass);
        MyImplementRunnableClassThread.start();
    }
}

class MyImplementRunnableClass implements Runnable{
    @Override
    public void run() {
        System.out.println("burns MyImplementRunnableClass");
    }
}

方式三、实现Callable 重写call方法,配合FutureTask
Callable一般用于有返回结果的非阻塞的执行方法

代码例子

package com.esoon.thread.threadImplementation.extendThread;

import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;

public class ImplementCallableGetReturnValueTest {
    public static void main(String[] args) throws Exception {
        MyCallable myCallable = new MyCallable();
        FutureTask futureTask = new FutureTask(myCallable);
        Thread thread = new Thread(futureTask);
        thread.start();
        Object o = futureTask.get();
        System.out.println("数据为" + o);
    }
}

class MyCallable implements Callable {

    /**
     * Computes a result, or throws an exception if unable to do so.
     *
     * @return computed result
     * @throws Exception if unable to compute a result
     */
    @Override
    public Object call() throws Exception {
        int count = 0;
        for (int i = 0; i < 100; i++) {
            count += i;
        }
        return count;
    }
}

方式四、基于线程池构造线程

线程池创建方式很多,这里以ThreadPoolExecutor举例子

需要引入线程池构建工厂,这里引入的是google的guava的ThreadFactoryBuilder

其他可参考

Java线程池中三种方式创建 ThreadFactory 设置线程名称_customizablethreadfactory_阿飞云的博客-CSDN博客本文讲一下Java线程池中创建 ThreadFactory 设置线程名称的三种方式。看代码即可。文章目录第一种 CustomizableThreadFactory第二种 ThreadFactoryBuilder第三种 BasicThreadFactory总结第一种 CustomizableThreadFactorySpring 框架提供的 CustomizableThreadFactory。ThreadFactory springThreadFactory = new CustomizableThhttps://blog.csdn.net/u010648555/article/details/106137206

例子

maven的pom.xml文件

<dependencies>
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>18.0</version>
        </dependency>
    </dependencies>
package com.esoon.thread.threadImplementation.extendThread;


import com.google.common.util.concurrent.ThreadFactoryBuilder;
import javafx.concurrent.Worker;

import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class ThreadPoolExecutorTest {
    public static void main(String[] args) {

        ThreadPoolExecutor executor = new ThreadPoolExecutor(
                5,                                        //核心线程数
                10,                                       //最大线程数
                200,                                      //非核心线程数存活时间数
                TimeUnit.MILLISECONDS,                    //非核心线程数存活时间单位
                new LinkedBlockingQueue<>(5),             //阻塞队列
                new ThreadFactoryBuilder().build(),       //线程工厂
                new ThreadPoolExecutor.AbortPolicy());    //拒绝策略

        for (int i = 0; i < 20; i++) {
            try {
                MyTask myTask = new MyTask(i);
                executor.execute(myTask);
                System.out.println("线程池中线程数目:" + executor.getPoolSize() +
                        ",队列中等待执行的任务数目:" + executor.getQueue().size() +
                        ",已执行完成的任务数目:" + executor.getCompletedTaskCount());

                //此处等待10ms主要是为了让异常栈打印的更整齐,没有其他任何意义
                Thread.sleep(10);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        executor.shutdown();
        System.out.println("-----------------over---------------------");
        System.out.println("线程池中线程数目:" + executor.getPoolSize() +
                ",队列中等待执行的任务数目:" + executor.getQueue().size() +
                ",已执行完成的任务数目:" + executor.getCompletedTaskCount());
    }
}

class MyTask implements Runnable {
    private int taskNum;

    public MyTask(int num) {
        this.taskNum = num;
    }

    @Override
    public void run() {
        System.out.println("正在执行task-" + taskNum);
        try {
            Thread.sleep(10000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("task-" + taskNum + "执行完毕");
    }
}

执行结果 

线程池中线程数目:1,队列中等待执行的任务数目:0,已执行完成的任务数目:0
正在执行task-0
线程池中线程数目:2,队列中等待执行的任务数目:0,已执行完成的任务数目:0
正在执行task-1
线程池中线程数目:3,队列中等待执行的任务数目:0,已执行完成的任务数目:0
正在执行task-2
线程池中线程数目:4,队列中等待执行的任务数目:0,已执行完成的任务数目:0
正在执行task-3
线程池中线程数目:5,队列中等待执行的任务数目:0,已执行完成的任务数目:0
正在执行task-4
线程池中线程数目:5,队列中等待执行的任务数目:1,已执行完成的任务数目:0
线程池中线程数目:5,队列中等待执行的任务数目:2,已执行完成的任务数目:0
线程池中线程数目:5,队列中等待执行的任务数目:3,已执行完成的任务数目:0
线程池中线程数目:5,队列中等待执行的任务数目:4,已执行完成的任务数目:0
线程池中线程数目:5,队列中等待执行的任务数目:5,已执行完成的任务数目:0
线程池中线程数目:6,队列中等待执行的任务数目:5,已执行完成的任务数目:0
正在执行task-10
线程池中线程数目:7,队列中等待执行的任务数目:5,已执行完成的任务数目:0
正在执行task-11
线程池中线程数目:8,队列中等待执行的任务数目:5,已执行完成的任务数目:0
正在执行task-12
线程池中线程数目:9,队列中等待执行的任务数目:5,已执行完成的任务数目:0
正在执行task-13
线程池中线程数目:10,队列中等待执行的任务数目:5,已执行完成的任务数目:0
正在执行task-14
java.util.concurrent.RejectedExecutionException: Task com.esoon.thread.threadImplementation.extendThread.MyTask@60e53b93 rejected from java.util.concurrent.ThreadPoolExecutor@5e2de80c[Running, pool size = 10, active threads = 10, queued tasks = 5, completed tasks = 0]
	at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2063)
	at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:830)
	at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1379)
	at com.esoon.thread.threadImplementation.extendThread.ThreadPoolExecutorTest.main(ThreadPoolExecutorTest.java:26)
java.util.concurrent.RejectedExecutionException: Task com.esoon.thread.threadImplementation.extendThread.MyTask@266474c2 rejected from java.util.concurrent.ThreadPoolExecutor@5e2de80c[Running, pool size = 10, active threads = 10, queued tasks = 5, completed tasks = 0]
	at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2063)
	at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:830)
	at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1379)
	at com.esoon.thread.threadImplementation.extendThread.ThreadPoolExecutorTest.main(ThreadPoolExecutorTest.java:26)
java.util.concurrent.RejectedExecutionException: Task com.esoon.thread.threadImplementation.extendThread.MyTask@5e481248 rejected from java.util.concurrent.ThreadPoolExecutor@5e2de80c[Running, pool size = 10, active threads = 10, queued tasks = 5, completed tasks = 0]
	at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2063)
	at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:830)
	at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1379)
	at com.esoon.thread.threadImplementation.extendThread.ThreadPoolExecutorTest.main(ThreadPoolExecutorTest.java:26)
java.util.concurrent.RejectedExecutionException: Task com.esoon.thread.threadImplementation.extendThread.MyTask@63947c6b rejected from java.util.concurrent.ThreadPoolExecutor@5e2de80c[Running, pool size = 10, active threads = 10, queued tasks = 5, completed tasks = 0]
	at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2063)
	at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:830)
	at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1379)
	at com.esoon.thread.threadImplementation.extendThread.ThreadPoolExecutorTest.main(ThreadPoolExecutorTest.java:26)
java.util.concurrent.RejectedExecutionException: Task com.esoon.thread.threadImplementation.extendThread.MyTask@355da254 rejected from java.util.concurrent.ThreadPoolExecutor@5e2de80c[Running, pool size = 10, active threads = 10, queued tasks = 5, completed tasks = 0]
	at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2063)
	at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:830)
	at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1379)
	at com.esoon.thread.threadImplementation.extendThread.ThreadPoolExecutorTest.main(ThreadPoolExecutorTest.java:26)
-----------------over---------------------
线程池中线程数目:10,队列中等待执行的任务数目:5,已执行完成的任务数目:0
task-0执行完毕
正在执行task-5
task-1执行完毕
正在执行task-6
task-2执行完毕
正在执行task-7
task-3执行完毕
正在执行task-8
task-4执行完毕
正在执行task-9
task-10执行完毕
task-11执行完毕
task-12执行完毕
task-13执行完毕
task-14执行完毕
task-5执行完毕
task-6执行完毕
task-7执行完毕
task-8执行完毕
task-9执行完毕

Process finished with exit code 0

方式五、lambda表达式方式重写run方法

这里在普及下匿名变量的知识,一种是线程没有变量指定直接运行,如下

package com.esoon.thread.threadImplementation.extendThread;

public class LambdaTest {
    public static void main(String[] args) {
        //匿名变量方式
        new Thread(() -> {
            int count = 0;
            for (int i = 0; i < 100; i++) {
                count += i;
            }
            System.out.println("count===" + count);
        }).start();
    }
}

非匿名方式,如下

package com.esoon.thread.threadImplementation.extendThread;

public class LambdaTest1 {
    public static void main(String[] args) {
        //非匿名变量方式
        Thread t = new Thread(() -> {
            int count = 0;
            for (int i = 0; i < 100; i++) {
                count += i;
            }
            System.out.println("count===" + count);
        });
//        变量启动线程
        t.start();
    }
}


以上代码例子可以访问或下载gitee码云链接

Java-Architect: java架构师学习资料https://gitee.com/burns/Java-Architect

❤关注点赞加收藏,编程一路不迷茫^_^

猜你喜欢

转载自blog.csdn.net/zp357252539/article/details/129894302