谈到Thread,有必要介绍下Runnable类。Runnable是一接口类,其中定义了run方法。大家注意下,run方法是带有前缀的:“public abstract void run()”,而我们知道,接口中的方法可以不用带这么多修饰符的,因为,接口方法默认的就是“public abstract”,run方法只需要带void修饰符就行,为什么Runnable接口会这样写?
从“public abstract void run()”可以看到,该接口方法没有返回值,运行完成则退出,不会有任何结果返回,这一点给我们带来了诸多不便。
普通的说法:“产生线程有2种方法,一是继承Thread类,二是实现Runnable接口”。我认为,其中第二点是不完全的,Runnable接口类名称翻译过来是“可运行的,可执行的”,是一种行为,行为执行是需要主体的。所以仅仅实现Runnable并不能产生新线程。如下代码和普通的接口实现没有任何分别:
RunnableTest需要由Thread类来包装后,才能产生新的线程。如下代码:
看到这里,Thread和Runnable到底什么关系呢?在Thread中是这么定义的:“
public class Thread implements Runnable”。Thread实现了Runnable接口,同时又持有了该接口的引用:“private Runnable target;”。Thread构造函数有以下4个参数:
1,ThreadGroup group,这是线程组类,该类负责管理线程,Thread对象启动时,会将其加入到线程组中。
2,Runnable target,之前提到的可运行的对象,具体执行计算或者任务。Thread的start()被调用后,java JVM才会执行target对象的run方法。直接调用Thread的run方法是没有任何效果的。
3,String name,新创建的线程的名称。默认时,线程的名称是“THREAD-”+线程序号。
4,long stackSize,线程堆栈大小。该值为0时,表明参数将被忽略。
Thread类提供了多线程的默认实现,一起来看看这些常用的方法吧
1,yield(),使得当前正在执行的线程对象临时暂停,允许其他线程运行。
2,sleep(long millis),使得当前正在执行的线程睡眠一段时间,该线程不会丧失所有权,也就是说,线程的所有资源仍然归其所有。
3,isAlive(),测试线程对象是否是活跃状态。
4,activeCount(),返回当前线程的线程组中活跃的线程数量。
5,join(),该方法实际上是调用join(long millis)方法,等待该线程结束一段时间,才开始主线程的运行。millis为0时表示永远等待。
6,setDaemon(boolean on),标记该线程是守护线程,还是用户线程。必须在start方法调用前被执行。当运行的线程都是守护线程时,java JVM会退出。
(未完待续)