一、进程与线程
- 进程:是程序的一个实例。当一个程序需要运行时,从硬盘加载这个程序的代码至内存,这就开启了一个进程。
- 线程:一个进程可以包括多个线程。线程是最小调度单位。
二、并发和并行
- 并发:轮流交替做多件事
- 并行:同时做多件事,互不打扰
三、同步和异步
- 同步:方法调用者需要等待结果的返回,才能继续执行
- 异步:方法的调用者不需要等待结果的返回,就能继续执行
四、创建线程
-
方法一:直接使用Thread
public class Test1 { public static void main(String[] args) { // 创建线程 Thread thread = new Thread("thread1") { @Override public void run() { // 要执行的任务 } }; // 启动线程 thread.start(); } }
<dependencies> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.12</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.3</version> </dependency> </dependencies>
@Slf4j(topic = "c.Test1") public class Test1 { public static void main(String[] args) { // 创建线程 Thread thread = new Thread("thread1") { @Override public void run() { log.debug("running"); } }; // 启动线程 thread.start(); log.debug("run"); } }
-
方法二:使用Runnable配合Thread
public class Test1 { public static void main(String[] args) { Runnable runnable = new Runnable() { @Override public void run() { // 要执行的任务 } }; // 创建线程 Thread thread = new Thread(runnable,"thread1"); // 启动线程 thread.start(); } }
-
方法三:FutureTask配合Thread
@Slf4j(topic = "c.Test1") public class Test1 { public static void main(String[] args) throws ExecutionException, InterruptedException { FutureTask<String> futureTask = new FutureTask<>(new Callable<String>() { @Override public String call() throws Exception { log.debug("kkkk"); return "xxx"; } }); // 创建线程 Thread thread = new Thread(futureTask, "thread1"); // 执行线程 thread.start(); // 接收返回值 log.debug(futureTask.get()); } }
五、windows下操作线程
查看线程:
- 使用任务管理器
- tasklist命令
- jps查看所有java线程
杀死线程:
- taskkill命令