在java中创建线程主要有两种方法:一种是继承Thread;另一种是实现Runnable。可以根据具体情况进行选择。
1、采用继承方式创建线程
该方法比较简单,主要通过继承java.lang.Thread类,并覆盖Thread类的Run()方法来完成线程的创建。Thread类封装了线程的行为。要创建一个线程,可以创建一个Thread的子类,并实现Thread中的Run()方法和Start()方法。
Run()方法必须进行重写,把线程索要执行的代码加入到这个方法中,也就是线程体。虽然run()方法是线程体,但不能直接调用run()方法,而是通过调用Start()方法来启动线程。在调用Start()的时候,start()方法会首先进行线程的初始化,然后在调用run()方法。
线程中常用的方法:线程中的已过时方法禁止使用。其他类中的过时方法不建议使用。
1.start:启动一个新线程。启动之后jvm会自动执行run方法。
2.run:线程启动之后执行的方法。
3.setName、getName:自动命名,Thread-0,1…
4.currentThread:得到当前运行的线程。
5.getPriority()、setPriority 得到和设置当前线程的优先级。优先级1-10,如果不指定默认是5. 理论上,谁优先级高,谁被cpu调度的可能性就大。但是优先级低的并不是不执行。资源不足的时候才有效果。
6.setDaemon:将线程置为守护线程。只能在线程start之前调用。一般用于为其他线程提供服务,比如GC。守护线程会随着其他非守护线程的结束而结束。isDaemon可以用于判断某个线程是否是守护线程。
7.sleep:让当前线程停止执行(休眠)一段时间。
8.join:如果在A线程中B线程join进来,则现在执行B的内容,直到B执行完毕才继续执行A。比如A是显示数据 B是收集收据。
9.yield:让位:让出执行权,和其他线程争夺资源,谁拿到cpu时间片谁执行。
线程的状态图:
示例1:使用继承创建线程
public class MyThtread extends Thread{ private static int count; public MyThtread(String name){ super(name); } public void run(){ for (int i = 0; i < 5; i++) { count++; System.out.println(count+":"+this.getName()); } } public static void main(String[] args) { MyThtread mt=new MyThtread("t1"); mt.start(); for (int i = 0; i < 5; i++) { count++; System.out.println(count+":main()"); } }}
运行结果:
1:main()
2:t1
3:main()
4:t1
5:main()
6:t1
8:t1
7:main()
9:t1
10:main()
注:上面程序运行后,main()生成新线程t1,并通过for循环输出变量count的值和线程的名称。因为main()也是一个线程,所以两个线程轮流执行,等到一个的时间片用完,另一个线程才会接着运行,所以程序每次运行的结果是不一样的。
Java中只允许单继承,如果类继承了其他类,那么就无法继承Thread类了。为此java提供了另外一种方法来实现多继承。
1、通过接口创建线程
该方法通过实现java.lang.Runable接口的类创建线程。该接口只定义了一个方法run(),所以必须在新类中实现它,但是Runable接口不支持线程,还必须创建Thread类的对象,这可以通过Thread类的构造方法public Thread(Runable target)来实现。
示例2:使用接口创建线程
public class MyThtread implements Runnable{ int count=0,number; public MyThtread(int i){ number=i; System.out.println("线程:"+number); } public void run(){ while(true){ System.out.println("线程:"+number+"计数:"+count); if(++count==6){ return; } } } public static void main(String[] args) { for (int i = 0; i < 5; i++) { new Thread(new MyThtread(i+1)).start(); } }}
结果:
线程:1
线程:2
线程:3
线程:4
线程:3计数:0
线程:3计数:1
线程:3计数:2
线程:3计数:3
线程:3计数:4
线程:3计数:5
线程:5
线程:1计数:0
线程:1计数:1
线程:1计数:2
线程:1计数:3
线程:1计数:4
线程:1计数:5
线程:2计数:0
线程:2计数:1
线程:2计数:2
线程:2计数:3
线程:2计数:4
线程:2计数:5
线程:4计数:0
线程:4计数:1
线程:4计数:2
线程:4计数:3
线程:4计数:4
线程:4计数:5
线程:5计数:0
线程:5计数:1
线程:5计数:2
线程:5计数:3
线程:5计数:4
线程:5计数:5