工欲善其事,必先利其器
要想使用好工具,就需要花时间来了解这个工具
所以先要了解已经理解线程类中的一些工具
工具一 Runnable 运行接口
1 Runnable接口应该由哪些打算通过某一线程执行其实例的类来实现,类必须定义为一个run的无参方法。
某一线程指的是线程类,比如Thread线程类
其 实例的类指的是实现了接口的类,而非Thread类的子类
简单点说就是通过一个Thread线程类来执行接口实例的类
2 Runnable接口为实现的该接口非Thread类的子类提供了一种激活方式,
通过实例化Thread对实例将实现接口的实例作为运行目标,就可以运行实现了非Thread子类的类,而无需创建Thread的子类。
这几句话是对上面说的,对上面的话解释,
激活方式是通过Thread的实例来运行Runnable接口实现类的对象实例
// Runnable接口的实现类
public class MyThread implements Runnable{
public void run(){
System.out.println("实现接口的类");
}
}
//通过Thread类来运行MyThread类的run()方法
第一步 先创建实现了接口的类实例
Mythread my = new MyThread();
// 第二步 Thread线程将接口实现类的实例作为运行目标
Thread my = new Thread(my);
my.start();//运行my类中的run方法
工具2 Thread类
Runnable运行接口线程实现类,描述了线程有优先级和创建线程的两种方式。
第一种,声明一个继承Thread的类
通过该类的子类初始化父类Thread,使用父类中的start()方法启动子类中的run方法
第二种实现runnable(运行)接口
将实现接口类的实例作为一个参数,作为Thread线程启动run方法的对象。
在该类中有多个重载的构造方法,其实主要就是两个。
Thread(ThreadGroup group,Runnable thread,String name)
创建一个线程,将接口的实例类作为线程组的一员,并设置Thread线程的名称
Thread(ThreaGroup group,Runnable thread,String long stackSize)
创建一个指定栈大小的线程,将接口实例类作为运行目标作为线程组的一员,并且设置Thread线程的名称
其他的创建线程的方法都是Thread( ThreadGroup group,Runnable run,String name)拆分出来的
创建新线程的第一种方式 继承Thread
// 将类声明为Thread的子类
public class MyThread extends Thread{
private int i=1;
//先初始化父类Thread(String name);
public MyThread(String nanme){
super(name);
}
// 通过父类中的start()方法启动重写run()方法
public vod run(){
while(i<10){
i++;
System.out.println("i="+i)
}
}
}
public static void main(String [] args){
// 先初始化一个新的线程,指定线程名称
Mythread my = new MyThread("子线程");
/*
* 第一步先初始化父类中的构造方法Thread(name)
* Threadd my = new Mythread("子线程")
* 然后在初始化子类
* Mythread my = new Mythread();
*/
// 使用创建的新线程来启动子类中的run方法
my.start();
}
创建线程的第二种方式 实现接口
// 创建用某个线程来执行实例的类
public class myThread implements Runnable{
private int i=1;
// 重写接口中的run方法
public void run(){
while(i<10){
i++;
System.out.println("i="+i)
}
}
}
测试类
public class demo{
public static void main(String[] args) {
// 1 创建接口类的实例
myThread mt = new myThread ();
/*
*2 创建一个要执行接口实例的类的新线程,将类的实例作为运行目标,
* 该目标调用类中run方法,同时设置该线程的名称
*/
Thread th = new Thread(mt,"新线程")
/*
* Thread( null,mt," 新线程",0)
* 在这里是使用的,没有指定线程组,因此都线程组为null
*/
}
}
总结:
使用继承的方式来创建线程实际上跟接口差不多,只不过在创建线程方式不同,和用途不同,
1 接口方式是使用Thread直接创建线程,通过线程启动run方法,用于多重继承
2 继承Thread方式是通过子类创建线程,通过线程驱动run方法,只能单重继承
3 都是将实现实例的类作为调用run方法的对象