关于java:创建实现多线程

1.创立线程的形式

1.继承Thread,重写run办法。

public class MyThread extends Thread {
    @Override
    public void run() {
        int i = 0;
        while(i < 100){
            i++;
            System.out.println("thread: i = "+i);
        }
    }
}

class Demo{
    public static void main(String[] args) {
        MyThread myThread = new MyThread();
        myThread.start();
        for (int j = 0; j < 100; j++) {
            System.out.println("main: j = "+j);
        }        
    }
}

2.实现Runnable接口

public class CountTask implements Runnable {
    @Override
    public void run() {
        int i = 0;
        while(i < 100){
            i++;
            System.out.println("thread: i = "+i);
        }
    }
}

class Demo22{
    public static void main(String[] args) {
        Thread thread = new Thread(new CountTask());
        thread.start();
    }
}

3、实现Callable接口**

通过实现Callable接口并重写call办法,并把Callable实例传给FutureTask对象,再把FutureTask对象传给Thread对象。它与Thread、Runnable最大的不同是Callable能返回一个异步解决的后果Future对象并能抛出异样,而其余两种不能。

2.启动线程的形式

调用Thread类型对象的start()办法。留神如果调用run()办法的话,只是简略的办法调用,而不是开启一条新的线程。

3.线程的状态

在Thread类的源码中能够看到定义了以下的线程的状态

状态 含意 详情
NEW 新建 线程被创立了,但未开始运行
RUNNABLE 可运行 调用start()后会变成该状态。该状态的线程位于可运行线程池中,变得可运行,期待获取cpu的执行权
BLOCKED 阻塞 表明以后线程(A)正在期待获取一个(L),获取锁后能力进入或再次进入同步的代码块或办法(即临界区)。当另一条持有这个锁的线程(B),调用了锁对象(L)的wait()办法后,以后线程(A线程)才有机会获取到锁(L)
WAITING 期待 以后线程(A)已取得了,已在临界区中。当调用了Object.wait()、Thread.join()、LockSupport.park()等办法(都不蕴含超时参数)后就会进入到期待状态。 期待的含意是以后线程(A)正在期待其它线程(B)执行对应的操作,以后线程能力回到RUNNABLE状态。比方:A线程调用了Object.wait(),那么A须要期待B线程调用Object.notify()或Object.notifyAll(),A能力回到RUNNABLE状态;A线程调用了B线程的join(),表明A须要期待B执行完,能力回到RUNNABLE状态,才有机会取得cpu执行权持续运行代码。
TIMED_WAITING 期待超时 以后线程(A)已取得了,已在临界区中。当调用了以下办法,就会进入期待超时的状态(含超时参数):Thread.sleep()、Object.wait()、Thread.join()、LockSupport.parkNanos、LockSupport.parkUntil。请留神wait和sleep的区别:wait是Object上的办法,sleep是Thread上的办法。wait会开释锁,但sleep不会开释锁。
TERMINATED 终结 Thread.run()办法运行完,就进入该状态

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理