博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
线程的2种实现方式
阅读量:5240 次
发布时间:2019-06-14

本文共 1873 字,大约阅读时间需要 6 分钟。

1.继承Thread类

声明一个内部(外部)类,假如名字叫做 Thread1,继承Thread类,重写(Override)其中的run方法。
定义一个类,里面再定义一个Thread1类型的对象,调用start()方法。
举个例子吧:
public class ThreadTest1 {
public static void main(String[] args){
    Thread1 t1 = new Thread1();
    t1.start();   
}
}
class Thread1 extends Thread{
    @Override   
    public void run(){
        for(int i=0;i<100;i++){
            System.out.println("Thread 111111-------"+i);
        }
    }
}

 

2.实现Runnable接口

声明一个内部(外部)类,假如名字叫做MyThread,实现Runnable接口,实现其中的run方法。
定义一个类,里面定义一个Thread类型的对象,把MyThread的对象当作参数传递进去,调用start方法。
public class ThreadTest2 {
public static void main(String[] args){
    MyThread mt = new MyThread();
    Thread t2 = new Thread(mt);
    //上面2行可以写成 Thread t2 = new Thread(new MyThread());
    t2.start();  
}
}
class MyThread implements Runnable{
    @Override   
    public void run(){
        for(int i=0;i<100;i++){
            System.out.println("Thread 22222-------"+i);
        }
    }
}
3.比较一下两种方法吧
从我自己的理解来看,实现Runnable接口的代码更健壮。
原因很简单,java是单继承的,从长远假设来看,也许这个类改天想干点其它的事情,必须再继承某个类,因为你已经继承了Thread类,你就不能再继承了。
接口之所以灵活就在于,你可以实现多个接口,而且实现接口了还可以继续继承一个类,所以呢,给程序员带来更大的灵活性。

 

4、 线程状态说明

线程状态从大的方面来说,可归结为:初始状态、可运行状态、不可运行状态和消亡状态,具体可细分为上图所示7个状态,说明如下:

1) 线程的实现有两种方式,一是继承Thread类,二是实现Runnable接口,但不管怎样,当我们new了thread实例后,线程就进入了初始状态;

2) 当该对象调用了start()方法,就进入可运行状态;

3) 进入可运行状态后,当该对象被选中,获得CPU时间片就会进入运行状态;

4) 进入运行状态后case就比较多,大致有如下情形:

﹒run()方法或main()方法结束后,线程就进入终止状态;

﹒当线程调用了自身的sleep()方法或其他线程的join()方法,就会进入阻塞状态(该状态既停止当前线程,但并不释放所占有的资源)。当sleep()结束或join()结束后,该线程进入可运行状态,继续等待OS分配时间片;

﹒当线程刚进入可运行状态(注意,还没运行),发现将要调用的资源被锁牢(synchroniza,lock),将会立即进入锁池状态,等待获取锁标记(这时的锁池里也许已经有了其他线程在等待获取锁标记,这时它们处于队列状态,既先到先得),一旦线程获得锁标记后,就转入可运行状态,等待OS分配CPU时间片;

﹒当线程调用wait()方法后会进入等待队列(进入这个状态会释放所占有的所有资源,与阻塞状态不同),进入这个状态后,是不能自动唤醒的,必须依靠其他线程调用notify()或notifyAll()方法才能被唤醒(由于notify()只是唤醒一个线程,但我们由不能确定具体唤醒的是哪一个线程,也许我们需要唤醒的线程不能够被唤醒,因此在实际使用时,一般都用notifyAll()方法,唤醒有所线程),线程被唤醒后会进入锁池,等待获取锁标记。

﹒当线程调用stop方法,即可使线程进入消亡状态,但是由于stop方法是不安全的,不鼓励使用,大家可以通过run方法里的条件变通实现线程的stop。

转载于:https://www.cnblogs.com/CuiHongYu/p/6867501.html

你可能感兴趣的文章
Linux第七周学习总结——可执行程序的装载
查看>>
java.io.IOException: read failed, socket might closed or timeout, read ret: -1
查看>>
细说php(二) 变量和常量
查看>>
iOS开发网络篇之Web Service和XML数据解析
查看>>
个人寒假作业项目《印象笔记》第一天
查看>>
java 常用命令
查看>>
ZOJ 1666 G-Square Coins
查看>>
CodeForces Round #545 Div.2
查看>>
卷积中的参数
查看>>
Linux中Zabbix4.0的搭建
查看>>
《LoadRunner没有告诉你的》之六——获取有效的性能需求
查看>>
51nod1076 (边双连通)
查看>>
Item 9: Avoid Conversion Operators in Your APIs(Effective C#)
查看>>
js去除空格
查看>>
学习Spring Boot:(二十八)Spring Security 权限认证
查看>>
IT学习神器——慕课网App获App Store、Android应用市场重磅推荐
查看>>
Linux网络状态工具ss命令使用详解
查看>>
深入浅出JavaScript(2)—ECMAScript
查看>>
编程珠玑第十一章----排序
查看>>
Face The Right Way POJ - 3276 (开关问题)
查看>>