java中多线程的三种方式
创建thread类的继承类
public class MyThread extends Thread{
@Override
public void run() {
// 这里的代码 就是一条新的执行路径
// 这个执行路径的触发方式不是调用run()方法,
// 而是通过调用Thread对象的start()方法启动任务
// run()方法不需要显式调用
for (int i=0;i<10;i++){
System.out.println("12345"+i);
}
}
}
public static void main(String[] args) {
// 开启MyThread线程,
// Thread线程为main线程的分支线程
MyThread thread = new MyThread();
// 使用start()方法触发myTread线程
thread.start();
// 主线程的代码语句:
for (int i=0; i<10; i++){
System.out.println("一二三四五" + i);
}
// 主线程和分支线程为并发执行
}
输出结果
多次运行的结果均不同。
可见Java中给线程分配CPU时间片是随机且无序的,即CPU时间片是由线程随机抢占的。
实现Runnable接口
/**
* 用于给线程进行执行的任务
*/
public class MyRunnable implements Runnable{
@Override
public void run() {
//线程的任务
for (int i=0;i<10;i++){
System.out.println("一二三四五"+i);
}
}
}
public class Main {
public static void main(String[] args) {
//实现runnable
//创建一个任务对象
MyRunnable mr=new MyRunnable();
//创建一个线程,并为其分配一个任务
Thread t=new Thread(mr);
//执行该线程
t.start();
for (int i=0;i<10;i++){
System.out.println("我是main"+i);
}
}
}
输出结果
和继承Thread相比,实现Runnable接口有如下优势
1: 通过创建任务,然后给线程分配的方式实现多线程,更适合多个线程同时执行相同任务的情况
2: 可以避免Java不允许单继承所带来的局限性,而多实现是允许的,同时还可以继承其它的类:
3: 任务与线程本身是分离的,提高了程序的健壮性;
4: 线程池技术可接受Runnable类型的任务,而不接收Tread类型的线程
带返回值的Callable接口
Runnable 与 Callable的相同点
Runnable 与 Callable的不同点