Java第十章——线程
程序、进程、线程
创建线程的三种方式
1、继承Thread类的方式
public class Mythread extends Thread{
重写run()方法{
for(int i =0;i<100;i++){
sout("Mythread"+i);
}
}
}
注意:启动线程不能用Mythread的对象来调用run方法
必须调用start()方法启动线程
//创建主线程
public static void main(String[] args){
//调用
Mythread m = new Mythread();
//启动线程
m.start();
//主线程
for(int i = 0;i<100;i+){
sout("main"+i);
}
}
运行结果:
由运行结果可以看到,线程是交替执行的。
没有规律。
每个线程都是独立的,是由CPU加载执行的,对于单核CPU来说,CPU在一个时间点上只能执行处理一个线程;CPU的加载速度很快,它是可以交替执行线程的。
2、实现Runnable接口来创建线程
实现Runnable接口其实就是实现它里面的run()方法
因为java.lang.Runnable接口中仅仅只有一个抽象方法:public abstract void run();
● Runnable接口的存在主要是为了解决Java中不允许多继承的问题。
public class Mythread implements Runnable{
//优点:避免了单继承的局限,提高了程序扩展性
重写run方法{
for (int i = 0; i < 1000; i++) {
System.out.println("Mythread"+i);
}
}
}
//创建一个主线程
main(String[] a){
//线程要执行的任务
Mythread m = new Mythread();
//创建一个新的线程
Thread t = new Thread(m);//创建一个线程作为外壳,将m包起来
t.start();//启动子线程
for (int i = 0; i < 1000; i++) {
System.out.println("main"+i);
}
}
3、实现Callable接口和Future创建线程
● 实现Callable接口与使用Runnable相比,Callable功能更强大些.
• 相比run()方法,可以有返回值
• 方法可以抛出异常
• 支持泛型的返回值
• 需要借助FutureTask类,获取返回结果
接收任务
FutureTask futureTask = new FutureTask(任务);
创建线程
Thread t = new Thread(futureTask);
t.start();
Integer val = futureTask.get();获得线程call方法的返回值
继承Thread类方式和实现Runnable接口方式的联系与区别:
-- 继承Thread类:线程代码存放在Thread子类run方法中。
-- 实现Runnable接口:线程代码存在接口子类的run方法。
【实现Runnable接口的好处】
1、避免了单继承的局限性
2、多个线程可以共享同一个接口实现类的对象,非常适合多个相同线程来处理同一份资源。</