本文仅供自己学习笔记记录,不作任何参考,我会将对具体知识的理解写在对应的方法前,方便自己理解学习。
学习多线程,那第一步,个人感觉应该就是怎么创建线程了。
首先,我通过资料得知,需要继承Thread类,或者实现Runnable接口。并重写其中的run()方法。
所以代码就如下了:
public class Test extends Thread {
@Override
public void run() {
//do something
}
}
public class Test implements Runnable {
@Override
public void run() {
//do something
}
}
实际上,Thread其实也是Runnable接口的子类,通过查阅资料得知,Thread的类定义为
public class Thread extends Object implements Runnable
通过阅读Thread类中部分代码,得知Thread类内部引用了Runnable接口,调用Thread的run方法,其实就是调用了Runnable接口中的run方法,所以如果是采用继承Thread类实现多线程,必须重写run()。
两种创建线程方法,那却别在哪里呢?
继承Thread类不适合资源共享,而继承Runnable,则可以实现资源共享。
继承Runnable还可以避免java单继承的限制
最后线程池仅仅能放入继承Runnable和callable的类,不能直接放入继承Thread的类
上边创建了线程,那接下来就是启动线程了
启动线程有,实例化继承Thread的类,并调用start,或者内部类解决,再或者通过实现runnable接口来调用。代码如下(接上方类)
public class TestMain {
public static void main(String[] args) {
Test test = new Test();
test.start();
}
}
public class TestMain {
public static void main(String[] args) {
Thread thread=new Thread(new Runnable() {
@Override
public void run() {
//dosomething
}
});
thread.start();
}
}
public class TestMain {
public static void main(String[] args) {
Test test = new Test();
Thread thread=new Thread(test);
thread.start();
}
}
现在启动了线程,那线程的周期状态应该做一定的了解,于是我了解到,线程的周期状态一般具有5种,如下
创建 : 就是上方记录到的创建线程
就绪 :创建了线程之后,并在启动start()方法之后,线程就就进入了就绪状态,通俗来讲就是,已经进入了线程队列,相当于现实中买车票排队了,就等到你了就可以买到票了。
运行 : 执行线程中的run方法内容
阻塞 : 当线程在执行的过程中,如果被人为的挂起操作,如sleep(),就会进入阻塞状态。 发生阻塞的时候,线程不能进入队列,只有阻塞消除,才能进入就绪状态。 通俗来讲就是 你买着票,突然来了警察例行检查,你得停下你手上的事。在检查完了之后,没问题了,重新排队购票。
死亡 : 执行stop()方法,或者执行run()方法结束
那创建和执行都知道了,那结束怎么办呢;
执行线程的stop()方法。
那如果我有两个线程,A线程想让B线程执行呢?
执行A线程的yield()方法
那如果我A线程突然不想跑了呢,想歇一下呢?
执行A线程的sleep()方法
那再如果我A线程结束时再执行B线程呢?
先执行A线程的join()方法,再执行B的start()方法
那再再如果,我AB线程同时进行的,B线程需要再A线程结束时同时结束呢?
b线程的setdeamon()为true,但需要再start()之前。 但我想到,这个设置为true的时候,一般是设置到main线程上的。main线程结束,b线程才结束,和A线程结束,B线程结束这样行不通啊(通过A线程里边调用B线程也可以,但我不是很想使用这种方法,之前有看过一篇文章,做定时任务,采用了这种方法),于是现在查阅资料中…………………………
----查找失败----直接进入下个问解决办法题,这个问题先保留,之后再看看有没有其他
上方都是单个线程,想到是否有类似组一样的,将自己 定义的线程放在一起呢?于是我找到了线程组ThreadGroup
在不定义线程组的情况下,所有的线程都在main线程组下,
要实现一个线程在一个组下,可采用
new Thread("线程组名","当前线程名称")
//当前线程名称可为null,会按照Thread-0自动递增,
//线程组名也可为null,默认当前方法的线程组
其他构造器如下:
Thread(ThreadGroup group,Runnable target):以target的run()方法为线程执行提创建新线程,新线程属于线程组group。
Thread(ThreadGroup group,Runnable target,String name):以target的run()方法为线程执行提创建新线程,并且输入group线程组,新线程名字为name。
Thread(ThreadGroup,String name):创建新线程,属于group线程组,新线程名字为name。
线程组可高效的管理多个线程,比如可以设置线程组为守护线程,也可同时打断线程组内的所有线程。
最后,今天看到一张图,引用以下 出处 : http://blog.csdn.net/evankaka
1、新建状态(New):新创建了一个线程对象。
2、就绪状态(Runnable):线程对象创建后,其它线程调用了该对象的start()方法。
该状态的线程位于可执行线程池中,变得可执行,等待获取CPU的使用权。
3、执行状态(Running):就绪状态的线程获取了CPU,执行程序代码。
4、堵塞状态(Blocked):堵塞状态是线程由于某种原因放弃CPU使用权。临时停止执行。直到线程进入就绪状态,才有机会转到执行状态。堵塞的情况分三种:
(一)、等待堵塞:执行的线程执行wait()方法,JVM会把该线程放入等待池中。
(wait会释放持有的锁)
(二)、同步堵塞:执行的线程在获取对象的同步锁时。若该同步锁被别的线程占用。则JVM会把该线程放入锁池中。
(三)、其它堵塞:执行的线程执行sleep()或join()方法。或者发出了I/O请求时。JVM会把该线程置为堵塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时。线程又一次转入就绪状态。(注意,sleep是不会释放持有的锁)
5、死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。