❤关注点赞加收藏,编程一路不迷茫^_^
方式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
其他可参考
例子
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
❤关注点赞加收藏,编程一路不迷茫^_^