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.setNamegetName:自动命名,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 ThreadRunable 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