Java:多线程
2023-04-18 16:47:56 时间
1.如何创建一个线程?
Java提供多种方式创建线程
- 继承Thread类,重新写run方法
- 实现Runnable接口,重新run方法
- 实现Callable接口,重新call方法
- 使用线程池
1.1继承Thread类
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
@Slf4j
public class MyTest {
@Test
public void test() {
MyThread myThread=new MyThread();
myThread.start();
}
}
@Slf4j
class MyThread extends Thread {
@Override
public void run() {
log.info("自定义线程");
}
}
1.2实现Runnable接口
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
@Slf4j
public class MyTest {
@Test
public void test() {
MyThread myThread = new MyThread();
Thread thread = new Thread(myThread);
thread.start();
}
}
@Slf4j
class MyThread implements Runnable {
@Override
public void run() {
log.info("自定义线程");
}
}
或
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
@Slf4j
public class MyTest {
@Test
public void test() {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
log.info("自定义线程");
}
});
thread.start();
}
}
或
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
@Slf4j
public class MyTest {
@Test
public void test() {
Thread thread = new Thread(() -> log.info("自定义线程"));
thread.start();
}
}
1.3实现Callable接口
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
@Slf4j
public class MyTest {
@Test
public void test() {
try {
MyThread myThread = new MyThread();
FutureTask<String> futureTask = new FutureTask<>(myThread);
Thread thread = new Thread(futureTask);
//启动线程
thread.start();
//获取线程返回值
String s = futureTask.get();
log.info(s);
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
Thread.currentThread().interrupt();
}
}
}
@Slf4j
class MyThread implements Callable<String> {
@Override
public String call() throws Exception {
log.info("自定义线程");
return "自定义线程执行完毕";
}
}
1.4使用线程池
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import java.util.concurrent.*;
@Slf4j
public class MyTest {
@Test
public void test() {
ExecutorService executorService = Executors.newSingleThreadExecutor();
MyThread myThread=new MyThread();
executorService.execute(myThread);
}
}
@Slf4j
class MyThread implements Runnable {
@Override
public void run() {
log.info("自定义线程");
}
}
2.线程有几种状态?
线程主要包括以下几个状态:
- new:创建成功,但还没有调用start方法
- runnable:包括就绪状态和运行状态(线程拿到时间片就处于运行状态;没有拿到时间片就处于就绪状态)
- blocked:阻塞状态
- waiting:等待状态
- timed-waiting:限时等待状态
- terminated:终止状态
相关文章
- 自动扩容真香!再也不怕你们给我爬挂了
- 从Java的类加载机制谈起:聊聊Java中如何实现热部署(热加载)
- Docke + Jenkins 实现自动化部署
- Maven 常用坐标依赖整理 (长期更新)
- 数据结构与算法 —— Java 实现(线性表)
- 数据结构与算法 —— Java 实现(链表)
- Java实现四种微信抢红包算法,拿走不谢
- Java与Node.js的较量--一场史诗之战
- [1085]对于maven中pom.xml依赖报红问题
- 升级到最新版本的IDEA后Maven私仓挂了
- maven 管理工具学习使用 —— (一)
- 手把手教你学 JDBC —— 结构分离
- java常用的7大排序算法汇总
- 基于Java实现简易的 注册 + 登录 系统 (中级)
- Java文件操作(超详细+代码示例)
- Java中对象数组的使用
- 求解最大公约数,最小公倍数(Java语言实现)
- 跨平台开发框架 Compose Multiplatform 1.0 发布
- Java小项目实现——简易的登录系统实现
- Java中的三元运算符