随写关于Runnable和Thread

 

由于刚刚学习多线程,线程并不是完全了解,写此片博客也只是为了加深记忆而写的。

一  在网上查了一些内容,借一张图片先说一下线程的几种运行的状态,如上图所示,线程有新建,可运行,等待/阻塞,运行,死亡这几种状态;

1.新建状态:当新建一个线程的时候就是新建的状态,

2.可运行状态:当线程调用start()方法的时候,线程就进入了可运行状态,也称之为就绪状态,当线程从等待,睡眠或者阻塞中的状态回来以后,也返回到可运行状态;

3.等待/睡眠/阻塞状态:这是线程有资格运行时所处的状态,这三种状态为一种,这种状态在线程中是有运行资格,但是没有运行条件的,当遇到某事件的时候,线程也就返回到了可运行状态;

4.运行状态:当线程正在运行的时候的状态,线程运行时,调用wait()方法线程就进入了等待状态,调用sleep()方法线程就进入了睡眠,有时候因为一些原因,线程进入了阻塞状态;

5.死亡状态:当线程的run()方法运行完毕或者调用程序的stop()方法的时候,线程死亡,线程死亡之后不可以再回到可运行状态,如果继续调用程序的start()方法,会报java.lang.IllegalThreadStateException异常

二  Thread类的一些常用方法:

1.wait():wait()方法是让线程进入等待状态,等待被唤醒的;

2.notify()和notifyall():notidy()方法就是用来唤醒线程的,当线程为等待状态时,可以用此方法来唤醒线程,notifyall()方法顾名思义就是唤醒所有在等待的线程了;顺便说一句,wait()和notify()方法并不是Thread特有的而是object类的,而且这两个方法必须卸载同步代码块synchronized中;

3.sleep(long time):线程调用sleep(long time)方法,通常情况下都是加上时间的,time以毫秒为单位;

4.currentTread():返回当前正在执行线程的引用,比如Thread.currentThread.getName(),就得到了当前正在执行线程的名字;

5.interrupt():中断当前线程;

6.interrupted():测试当前线程是否被中断;

7.isAlive():测试当前线程是否属于活动线程

8:setdaeom():将当前的线程定义为守护线程和用户线程;isdaeom()则是用来判断当前的线程是否属于用户线程或者守护线程;

9:join():等待线程终止,作个假设,我们需要用线程来计算值的时候,线程不调用join()方法时,返回的值不一定是正确的 ,需要用join()方法来等待线程停止,停止以后得到结果;

10:yield():暂停正在执行的线程对象,也就是让出当前线程对cpu的控制权,让cpu去执行其他的线程;

11:run()和start():run()方法一般都是需要重写的,调用start()执行线程,也就是从run()方法开始执行;

12:setPriority():改变线程的优先级;

三  Runnable和Tread

Runnable是接口,Runnable接口中只有定义了一个run()方法,Thread类实现了Runnable接口,并且重写了run()方法;

当我们新建一个类,如果此类直接继承了Thread类的话,直接调用start()方法便可以启动线程,但是当我们实现Runnable接口时,new Thread().start()是得不到我们想要的线程的,还需要将实现Runnable接口的类当做参数传进去,Thread类有构造函数便是为了传入Runnable的值的,所以应当new Thread(实现Runnable接口的类).start(),这样子便可以启动实现Runnable接口的类的线程了

现在在继承Thread类和实现Runnable接口两种方法来使用线程,一般都是实现Runnable的,因为java不支持多继承,但是支持实现多个接口,所以当你继承了Thread类的时候,便不能继承其他的类了;

昨天看到一个事例,在main方法中调用getName()方法会返回main名称的主线程,而在其他地方就是线程自定义的线程名,比如Thread-0之类;

posted on 2014-12-24 21:44  Kong_林  阅读(550)  评论(0)    收藏  举报

导航