java线程详解一
程序、进程、线程的概念以及它们之间的关系
程序:指代码的集合,是应用程序执行的脚本。
进程:进程是一个静态的概念,指内存中运行的应用程序,是系统运行程序的基本单位,在一个系统中可以同时运行多个程序,每个程序都对应一个进程。
线程:是指进程中的一个执行流程,是比进程更小的运行单位,一个进程中可以运行多个线程,
在同一个时间点上,一个CPU只能支持一个线程在执行。因为CPU运行的速度很快,因此我们看起来的感觉就像是多线程一样。
什么才是真正的多线程?如果你的机器是双CPU,或者是双核,这确确实实是多线程。
创建多线程的方式
1、继承 java.lang.Thread类,并重写run方法
2、实现 java.lang.Runnable接口,并重写run方法
java中的main()方法是一个线程,这个线程叫主线程
实例一:继承Thread类创建线程
1 public class ThreadTest { 2 3 public static void main(String[] args) { 4 5 myThread th = new myThread(); 6 th.start();//开启这个线程,并执行run方法 7 8 while (true){ 9 System.out.println(Thread.currentThread().getName()); 10 System.out.println("兔子加油,别骄傲"); 11 } 12 13 14 } 15 } 16 17 /** 18 * 自定义线程 19 */ 20 class myThread extends Thread{ 21 22 @Override 23 public void run() { 24 25 while (true){ 26 System.out.println(this.getName());//获取线程名称 27 System.out.println("乌龟领先了,加油"); 28 } 29 30 31 } 32 }
实例二:实现Runnable接口创建线程
1 public class ThreadTest2 { 2 3 public static void main(String[] args) { 4 5 myThread2 th = new myThread2(); 6 Thread thread = new Thread(th); 7 thread.start();//开启这个线程,并执行run方法 8 9 while (true){ 10 System.out.println(Thread.currentThread().getName());//获取线程名称 11 System.out.println("兔子加油,别骄傲"); 12 } 13 14 15 } 16 } 17 18 /** 19 * 自定义线程 20 */ 21 class myThread2 implements Runnable{ 22 23 @Override 24 public void run() { 25 26 while (true){ 27 System.out.println(Thread.currentThread().getName());//获取线程名称 28 System.out.println("乌龟领先了,加油"); 29 } 30 31 32 } 33 }
实例三:内部类的方式创建线程(建议使用)
1 public class ThreadTest3 { 2 3 public static void main(String[] args) { 4 5 Thread th = new Thread(new Runnable() { 6 @Override 7 public void run() { 8 while (true){ 9 System.out.println(Thread.currentThread().getName());//获取线程名称 10 System.out.println("乌龟领先了,加油"); 11 } 12 13 14 } 15 }); 16 th.start();//开启这个线程,并执行run方法 17 18 while (true){ 19 System.out.println(Thread.currentThread().getName());//获取线程名称 20 System.out.println("兔子加油,别骄傲"); 21 } 22 23 24 } 25 }
多个线程运行如下:
上面可以看出两个两个线程都执行了,这两个线程是并行执行的,它们都在抢夺CPU的使用权。这样刚好充分利用了CPU的使用率
start()方法和run()方法的区别
strat方法:用于开启一个线程,此线程并不会运行,
run方法:运行一个线程,它是由JVM再运行相应线程时直接调用的
线程的生命周期
线程的生命周期分为五中状态:1 新建状态、2 可执行状态、3 运行状态、4 阻塞状态、5 死亡状态
sleep():让当前线程睡眠,采用毫秒值
join():让正在运行的线程停下来,执行加入后的线程,并一直执行完毕,再执行被终止的线程
interrupt():终止线程
yield(): 把正在运行的线程,打回可以执行的状态,继续争抢CPU的使用权