大佬的理解->Java多线程(一)多线程基础
大佬的理解->Java多线程(二)常用的实现多线程的两种方式
1、继承Thread类
继承Thread必须重写run方法,(具体业务执行方法,需要执行的业务方法,定义在此方法中),注意此方法是线程启动后线程自动调用的;
案例
public class MyThread extends Thread{
@Override
public void run() {
//线程执行的业务方法
System.out.println(\"子线程执行\");
for (int i = 0;i < 5;i++){
System.out.println(\"--- 线程名---:\"+Thread.currentThread().getName()+\",序号:\"+i);
}
}
public static void main(String[] args) {
//主线程
System.out.println(\"***主线程执行***\");
System.out.println(\"***线程名***:\"+Thread.currentThread().getName());
//创建一个线程并启动,只能通过主线程创建其他线程
MyThread thread1 = new MyThread();
MyThread thread2 = new MyThread();
//启动线程:start()方法(一旦启动,自动启动子线程,当前线程继续向下执行,不会等子线程)
thread1.start();
//启动多线程
//多线程并发执行:不是正真一样上的并行执行(肉眼感官是并行),而是通过cpu的调度算法,有序cpu执行极快,所以肉眼看起来是并行的;
thread2.start();
//调用run方法,不可以启动线程,就是对象的普通方法调用,等run方法执行结束,主线程才能继续执行
//thread1.run();
System.out.println(\"----主线程执行结束----\");
}
}
运行结果
***主线程执行***
***线程名***:main
----主线程执行结束----
子线程执行
--- 线程名---:Thread-0,序号:0
--- 线程名---:Thread-0,序号:1
--- 线程名---:Thread-0,序号:2
--- 线程名---:Thread-0,序号:3
--- 线程名---:Thread-0,序号:4
子线程执行
--- 线程名---:Thread-1,序号:0
--- 线程名---:Thread-1,序号:1
--- 线程名---:Thread-1,序号:2
--- 线程名---:Thread-1,序号:3
--- 线程名---:Thread-1,序号:4
注意start()方法和run()方法的区别
start():启动线程start()方法(一旦启动,自动启动子线程,当前线程继续向下执行,不会等子线程);
run() :调用run方法,不可以启动线程,就是对象的普通方法调用,等run方法执行结束,主线程才能继续执行;
2、实现Runnable接口
必须实现run方法;
案例
public class MyRunnable implements Runnable{
private int num = 5;
@Override
public void run() {
//线程执行的业务方法
System.out.println(\"子线程执行\");
for (int i = 0;i < 5 ;i++){
if(num>0){
System.out.println(\"--- 线程名---:\"+Thread.currentThread().getName()+\",序号:\"+num--);
}
}
}
public static void main(String[] args) {
//主线程
System.out.println(\"***主线程执行***\");
System.out.println(\"***线程名***:\"+Thread.currentThread().getName());
//创建一个子线程,并启动
MyRunnable runnable1 = new MyRunnable();
//实现Runnable接口方式创建的线程,不能自己启动,只能通过Thread类,将Runnable作为参数传入Thread类的构造方法中,
// 构造线程对象,才可以启动
Thread thread1 = new Thread(runnable1);
thread1.start();
//创建多线程 (如果传入的Runnable参数一样,可以共享资源)
Thread thread2 = new Thread(runnable1);
thread2.start();
System.out.println(\"----主线程执行结束----\");
}
}
运行结果
***主线程执行***
***线程名***:main
----主线程执行结束----
子线程执行
子线程执行
--- 线程名---:Thread-0,序号:5
--- 线程名---:Thread-1,序号:4
--- 线程名---:Thread-0,序号:3
--- 线程名---:Thread-1,序号:2
--- 线程名---:Thread-0,序号:1
注意
如果传入的Runnable参数一样,可以共享资源;
3、比较两种创建线程的方式
继承Thread类
- 编写简单,可直接操作线程
- 适用于单继承
实现Runnable接口
- 避免单继承局限性
- 便于共享资源
来源:https://www.cnblogs.com/xiaoqigui/p/16393353.html
本站部分图文来源于网络,如有侵权请联系删除。