进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以启动多个线程。 线程是比进程更小的执行单位,它是在一个进程中独立的控制流,一个进程可以启动多个线程,每条线程并行执行不同的任务。
初始(NEW):线程被构建,还没有调用 start()。
运行(RUNNABLE):包括操作系统的就绪和运行两种状态。
阻塞(BLOCKED):一般是被动的,在抢占资源中得不到资源,被动的挂起在内存,等待资源释放将其唤醒。线程被阻塞会释放CPU,不释放内存。
等待(WAITING):进入该状态的线程需要等待其他线程做出一些特定动作(通知或中断)。
超时等待(TIMED_WAITING):该状态不同于WAITING,它可以在指定的时间后自行返回。
终止(TERMINATED):表示该线程已经执行完毕。
继承 Thread 创建线程代码如下。run()方法是由jvm创建完操作系统级线程后回调的方法,不可以手动调用,手动调用相当于调用普通方法。
/** * @author: joshua317 * @time: 2021-09-09 08:11 */ public class MyThread extends Thread { public MyThread() { } @Override public void run() { for (int i = 0; i < 10; i++) { System.out.println(Thread.currentThread() + ":" + i); } } public static void main(String[] args) { MyThread mThread1 = new MyThread(); MyThread mThread2 = new MyThread(); MyThread myThread3 = new MyThread(); mThread1.start(); mThread2.start(); myThread3.start(); } }
Runnable 创建线程代码:
/** * @author: joshua317 * @time: 2021-09-09 08:21 */ public class RunnableTest { public static void main(String[] args){ Runnable1 r = new Runnable1(); Thread thread = new Thread(r); thread.start(); System.out.println("主线程:["+Thread.currentThread().getName()+"]"); } } class Runnable1 implements Runnable{ @Override public void run() { System.out.println("当前线程:"+Thread.currentThread().getName()); } }
实现Runnable接口比继承Thread类所具有的优势:
Callable 创建线程代码:
/** * @author: joshua317 * @time: 2021-09-09 08:34 */ public class CallableTest { public static void main(String[] args) { Callable1 c = new Callable1(); //异步计算的结果 FutureTask<Integer> result = new FutureTask<>(c); new Thread(result).start(); try { //等待任务完成,返回结果 int sum = result.get(); System.out.println(sum); } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); } } } class Callable1 implements Callable<Integer> { @Override public Integer call() throws Exception { int sum = 0; for (int i = 0; i <= 100; i++) { sum += i; } return sum; } }
使用 Executor 创建线程代码:
/** * @author: joshua317 * @time: 2021-09-09 08:50 */ public class ExecutorsTest { public static void main(String[] args) { //获取ExecutorService实例,生产禁用,需要手动创建线程池 ExecutorService executorService = Executors.newCachedThreadPool(); //提交任务 executorService.submit(new RunnableDemo()); } } class RunnableDemo implements Runnable { @Override public void run() { System.out.println("joshua317"); } }