标签(空格分隔): 线程运行状态
如下是是我编写的一个图,大家可以作为参考:
1.new一个thread子类也是创建了一个线程;
2.创建完毕之后start()-----运行,
3.然后从运行-------sleep(time)----冻结----sleep(time)时间到了,恢复到运行;
4.还有一种,是线程运行的时候------wait时间------到冻结状态-------然后notify()唤醒-----然后恢复到运行状态;
5.消亡:线程运行中/冻结:stop()/run方法结束---------消亡;
6.临时状态:当前状态等待CPU的执行权,具备运行资格没有执行权,
7.冻结:放弃了执行资格;
8.冻结状态-----恢复---临时状态/运行状态;
创建了对象之后,都要匹配一个名称,线程的名称都要定义在线程的事物里面:
class Demo extends Thread{ private String name; Demo(String name){ this.name=name; } public void run(){//将运行的代码放在run方法中 for(int x=0;x<60;x++) { System.out.println(this.getName()+"demo run-----"+x); } } } class ThreadDemo{ public static void main(String[] args){ Demo d1= new Demo("one");//创建好一个线程 Demo d2= new Demo("two"); d1.start(); d2.start(); for(int x=0;x<60;x++){ System.out.println("helloworld!----"+x); } } }
原来线程都有自己默认的名称,Thread-编号,该编号从零开始;
2.上述的名称是不是不太好看,这里可以使用set方法来定义名称;
static Thread currentThread():获取当前线程的对象;
getName():获取线程名称;
设置线程名称:setName或者构造方法;
观察如下的程序:
class Ticket extends Thread{ private int tick=100; public void run(){ while (true){ if(tick>0) { System.out.println(Thread.currentThread().getName()+"sale:" + tick--); } } } } class TickDemo{ public static void main(String[] args){ Ticket t1=new Ticket(); Ticket t2=new Ticket(); Ticket t3=new Ticket(); Ticket t4=new Ticket(); t1.start(); t2.start(); t3.start(); t4.start(); } }
执行结果:
发现100个票,卖出去了400张票;每个对象里面包含了100张票;
class Ticket extends Thread{ private static int tick=100; public void run(){ while (true){ if(tick>0) { System.out.println(Thread.currentThread().getName()+"sale:" + tick--); } } } } class TickDemo{ public static void main(String[] args){ Ticket t1=new Ticket(); Ticket t2=new Ticket(); Ticket t3=new Ticket(); Ticket t4=new Ticket(); t1.start(); t2.start(); t3.start(); t4.start(); } }
执行通过;
class Ticket implements Runnable{ private static int tick=100; public void run(){ while (true){ if(tick>0) { System.out.println(Thread.currentThread().getName()+"sale:" + tick--); } } } } class TickDemo{ public static void main(String[] args){ // Ticket t1=new Ticket(); // Ticket t2=new Ticket(); // Ticket t3=new Ticket(); // Ticket t4=new Ticket(); // t1.start(); // t2.start(); // t3.start(); // t4.start(); Ticket t=new Ticket(); Thread t1=new Thread(); Thread t2=new Thread(); Thread t3=new Thread(); Thread t4=new Thread(); t1.start(); t2.start(); t3.start(); t4.start(); } }
上述代码:能否实现呢?
分析:t1调用运行的run()是Thread里面的run,在这次代码里面未重写;
package com.wangaling; class Ticket implements Runnable{ private static int tick=100; public void run(){ while (true){ if(tick>0) { System.out.println(Thread.currentThread().getName()+"sale:" + tick--); } } } } class TickDemo{ public static void main(String[] args){ // Ticket t1=new Ticket(); // Ticket t2=new Ticket(); // Ticket t3=new Ticket(); // Ticket t4=new Ticket(); // t1.start(); // t2.start(); // t3.start(); // t4.start(); Ticket t=new Ticket(); Thread t1=new Thread(t); Thread t2=new Thread(t); Thread t3=new Thread(t); Thread t4=new Thread(t); t1.start(); t2.start(); t3.start(); t4.start(); } }
执行结果:
上述代码可以正常实现售票的功能;
创建线程的第二种方式,实现runnable接口
步骤1:
1。定义类实现Runable接口;
2.覆盖Runable接口中的run方法:将线程要运行的代码存在在run方法中
3.通过Thread类建立线程对象
4.将Runable接口的子类对象作为实际参数传递给Thread类的构造函数:为什么要将Runable接口的子类的对象传递给Thread的构造函数,因为,自定义的run方法所属的对象是Runable接口的子类对象,所以要让线程去指定指定对象的run方法,就必须明确该run方法所属的对象;
5.调用Thread类的start方法开启线程,并调用Runable接口子类的run方法;
继承Thread:线程代码存放在Thread子类的run方法中;
实现Runable,线程代码存在接口的子类的run方法