1. 多线程的创建的三种方式
1.1. 继承Thread类1.2. 实现Runnable接口1.3 实现Callable接口 2. 继承Thread和实现Runnable的区别
1. 多线程的创建的三种方式多线程的创建主要有三种方式。
继承Thread类(将任务和线程合并在一起)实现Runnable接口(将任务和线程分开了)实现Callable接口(利用FutureTask执行任务) 1.1. 继承Thread类
package com.asleepyfish;
public class InheritThread extends Thread {
private int num = 5;
private final String name;
public InheritThread(String name) {
this.name = name;
}
@Override
public void run() {
while (num > 0) {
System.out.println(name + "拿了第" + num-- + "张票");
try {
Thread.sleep(20);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
InheritThread thread1 = new InheritThread("小明");
InheritThread thread2 = new InheritThread("小华");
thread1.start();
thread2.start();
}
}
第一次运行结果: 小华拿了第5张票 小明拿了第5张票 小明拿了第4张票 小华拿了第4张票 小华拿了第3张票 小明拿了第3张票 小明拿了第2张票 小华拿了第2张票 小明拿了第1张票 小华拿了第1张票 =================== 第二次运行结果: 小华拿了第5张票 小明拿了第5张票 小明拿了第4张票 小华拿了第4张票 小华拿了第3张票 小明拿了第3张票 小华拿了第2张票 小明拿了第2张票 小华拿了第1张票 小明拿了第1张票
多线程的执行是乱序执行的,每次的结果也都是随机的。
1.2. 实现Runnable接口package com.asleepyfish;
public class RunnableThread implements Runnable {
private int num = 5;
@Override
public void run() {
while (num > 0) {
System.out.println(Thread.currentThread().getName() + "拿了第" + num-- + "张票");
try {
Thread.sleep(20);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
// 这里还是new了两个RunnableThread对象,两个线程并不是操作同一个资源,没有实现资源共享
new Thread(new RunnableThread(), "小明").start();
new Thread(new RunnableThread(), "小华").start();
// 如果只new了一个对象去执行会引发并发线程安全问题
// RunnableThread runnableThread = new RunnableThread();
// new Thread(runnableThread, "小红").start();
// new Thread(runnableThread, "小强").start();
}
}
第一次运行结果: 小明拿了第5张票 小华拿了第5张票 小华拿了第4张票 小明拿了第4张票 小明拿了第3张票 小华拿了第3张票 小华拿了第2张票 小明拿了第2张票 小华拿了第1张票 小明拿了第1张票 ================ 第二次运行结果: 小明拿了第5张票 小华拿了第5张票 小华拿了第4张票 小明拿了第4张票 小明拿了第3张票 小华拿了第3张票 小华拿了第2张票 小明拿了第2张票 小明拿了第1张票 小华拿了第1张票1.3 实现Callable接口 2. 继承Thread和实现Runnable的区别
参考: Java多线程学习
继承Thread类,则不适合资源共享。实现Runable接口的话,很容易实现资源共享。
总结:
实现Runnable接口比继承Thread类所具有的优势
- 适合多个相同的程序代码的线程去处理同一个资源可以避免java中的单继承的限制增加程序的健壮性,代码可以被多个线程共享,代码和数据独立线程池只能放入实现Runable或callable类线程,不能直接放入继承Thread的类
main方法其实也是一个线程。在java中所有的线程都是同时启动的,至于什么时候,哪个先执行,完全看谁先得到CPU的资源。



