java多线程

java中,线程有五种状态:创建,就绪,运行,阻塞,死亡

创建:生成线程对象,但并没有调用该对象的start方法,则线程处于创建状态

就绪:当调用了线程的start方法后,该线程就进入了就绪状态,但此时线程调度程序还没把该线程设置为当前线程,此时就处于就绪状态,在线程运行之后,从等待或者睡眠中回来之后,也会处于就绪状态。

运行:线程调度程序将处于就绪状态的线程设置为当前线程,此时线程就进入了运行状态,开始执行run函数中代码。

阻塞:线程正在运行的时候,被暂停,通常是为了等待某个时间的发送(比如某资源就绪)之后,再继续运行。sleep,suspend,wait等方法都可以导致线程阻塞。

死亡:如果一个线程的run方法执行结束或者调用stop方法之后,该线程就会死亡。对于已经死亡的线程,无法再使用start方法令其进入就绪。

实现并启动线程的两种方法

1,写一个类继承Thread类,重写run方法,用start启动线程。

2,写一个类实现Runnable接口,实现run方法,使用new Thread(Runnable target).start()方法来启动。

注意,非必须情况,不要使用run方法启动,否则,会一直处于线程中,导致其他代码停止执行,除非调用stop或run方法执行结束线程,才会继续执行其他逻辑。

调用start方法之后,线程会被放到等待队列,等待cpu调度,并不一定马上执行,只是处于就绪状态。

1,start()方法来启动线程,真正实现了多线程运行。这时,无需等待run方法体代码执行完毕,可以直接继续执行下面的代码。通过Thread类的start()方法来启动一个线程,此时线程处于就绪状态,并没有运行,然后通过此Thread类调用方法run()来完成其运行操作。方法run()为线程体,它包好了要执行的这个线程的内容。run方法运行结束,此线程终止。

2,run()方法作为普通方法的方式被调用,程序还是要顺序执行,要等到run方法体执行完毕之后,才能继续执行下面的代码。则会出现程序中只有主线程这一个线程,程序执行路径还是只有一条,这样就没有达到写线程的目的。

class hello extends Thread {
 
    public hello() {
 
    }
 
    public hello(String name) {
        this.name = name;
    }
 
    public void run() {
        for (int i = 0; i < 5; i++) {
            System.out.println(name + "运行     " + i);
        }
    }
 
    public static void main(String[] args) {
        hello h1=new hello("A");
        hello h2=new hello("B");
        h1.run();
        h2.run();
    }
 
    private String name;

运行结果

A运行     0

A运行     1

A运行     2

A运行     3

A运行     4

B运行     0

B运行     1

B运行     2

B运行     3

B运行     4

public static void main(String[] args) {
        hello h1=new hello("A");
        hello h2=new hello("B");
        h1.start();
        h2.start();
    }

运行结果

A运行     0

B运行     0

B运行     1

B运行     2

B运行     3

B运行     4

A运行     1

A运行     2

A运行     3

A运行     4

感谢:http://blog.csdn.net/xuxurui007/article/details/7685076

原文地址:https://www.cnblogs.com/javadongx/p/java_thread_runnable.html