JavaSE-多线程(线程-Thread)
五种状态:

新线程:
利用new关键字创建线程对象实例后,仅作为一个对象实例存在,JVM没有为其分配CPU时间片和其他线程运行资源。
就绪状态:
在处于创建状态的线程中调用start方法将线程的状态转换为就绪状态。
这时,线程已经得到除CPU时间之外的其它系统资源,
只等JVM的线程调度器按照线程的优先级对该线程进行调度,从而使该线程拥有能够获得CPU时间片的机会。
运行状态:
就绪态的线程获得cpu就进入运行态
等待/阻塞:
线程运行过程中被剥夺资源或者,等待某些事件就进入等待/阻塞状态,
suspend()方法被调用,sleep()方法被调用,线程使用wait()来等待条件变量,线程处于I/O等待等。
调用suspend方法将线程的状态转换为挂起状态。
这时,线程将释放占用的所有资源,但是并不释放锁,所以容易引发死锁,直至应用程序调用resume方法恢复线程运行。
等待事件结束或者得到足够的资源就进入就绪态
死亡状态:
当线程体运行结束或者调用线程对象的stop方法后线程将终止运行,由JVM收回线程占用的资源。
使用线程的步骤:
定义线程、创建线程对象、启动线程、终止线程
继承Thread类重写run方法并构建其对象
run()方法中的代码和其他方法中的代码区别在于它可以和其他线程的run()方法代码并行执行
线程不具备任何循环特性
Thread() 创建一个新的线程
Thread(String name) 创建一个指定名称的线程
Thread(Runnable target) 利用Runnable对象创建一个线程,启动时将执行该对象的run方法
Thread(Runnable target, String name) 利用Runnable对象创建一个线程,并指定该线程的名称
Runnable接口:
直接继承Thread类实现线程的方法存在局限性,一旦类继承Thread之后就不能再继承其他父类
可以通过实现java.lang.Runnable接口的方式来实现线程
匿名内部类的方式:
public class CreateThreadByInnerImplements { public static void main(String[] args) { //还可以使用匿名内部类实现接口 Runnable runnable = new Runnable() { @Override public void run() { System.out.println("创建了一个线程的对象"); } }; Thread thread = new Thread(runnable); thread.start(); } }
也可以用lambda表达式简化语法:
public static void main(String[] args) { //使用lambda方法简化语法 //这里直接写括号的前提是:接口中只有一个要实现的方法 Runnable runnable = () -> System.out.println("匿名内部类"); Thread thread = new Thread(runnable); thread.start(); }
不能多次执行start()方法。
start()方法的调用后并不是立即执行多线程代码,而是使该线程变为就绪状态,
什么时候运行是由操作系统调度决定的。
不建议使用stop()方法停掉线程,run()会自然消亡。
不同线程状态之间的转换:
new-->ready:
start()
ready -->run:
run()
running-->blocked:
Thread.sleep() 用的较多,需要提供一个时长,可以让优先级较低的线程运行
或者:TimeUnit.SECONDS.sleep(2);(睡眠2秒)
running-->ready:
Thread.yield() 短暂地回到就绪态,让其他线程中较高优先级的线程运行
其它常用操作:
//返回线程名称
System.out.println(Thread.currentThread().getName());
//如果类已经继承了Thread类,那么可以直接调用方法
System.out.println(getName() + " ->" + getPriority());
//返回线程优先级(默认为 1-10 的中间的一个像 5,数值越大优先级越高)
System.out.println(Thread.currentThread().getPriority());
//设置优先级
setPriority(6);
//设置线程的名称
Thread.currentThread().setName("lxr");
synchronized
synchronized关键字可以给线程上锁
EG:synchronized void f(){}
synchronized会降低性能,但会保证数据的一致
浙公网安备 33010602011771号