多线程 1
方法一代码:
/**
* 实现线程的第一种方式
* 创建线程对象:new即可
* 启动线程:调用线程对象的start方法
*/
public class TreadTest01 {
public static void main(String[] args) {
// 这里的代码属于主线程,在主栈中运行
// 新建一个分支线程对象
MyThread myThread = new MyThread();
// myThread.run(); //这行代码不会启动线程,不会分配新的分支栈(单线程),普通的方法调用
// 启动线程
// start 方法的作用:启动一个分支线程,在 JVM 中开辟一个新的栈空间
// 这段代码任务完成后瞬间就结束了,这段代码的任务只是为了开启一个新的栈空间,只要新的栈空间开出来,start方法就结束了,
// 线程也就启动成功了。启动成功的线程会自动调用run方法,且run方法在分支栈的栈底部(压栈)
// run方法在分支栈的地位类似于main方法在主栈的地位,run与main是平级的
myThread.start(); // 瞬间结束
// 从这里开始并发
// 这里的代码还是运行在主线程中
for (int i = 0; i < 5; i++) {
System.out.println("主线程---->" + i);
}
}
}
class MyThread extends Thread{
@Override
public void run() {
// 在这里编写程序,这里的程序运行在分支栈中
for (int i = 0; i < 10; i++) {
System.out.println("分支线程--->" + i);
}
}
}
运行结果:
分支线程--->0
主线程---->0
分支线程--->1
主线程---->1
分支线程--->2
主线程---->2
分支线程--->3
主线程---->3
分支线程--->4
主线程---->4
分支线程--->5
分支线程--->6
分支线程--->7
分支线程--->8
分支线程--->9
- 由上面的结果可以看出,有两个线程在并发!
- 主线程结束后,分支线程还在执行
方法二代码:
/**
* 实现线程的第二种方法
*/
public class ThreadTest02 {
public static void main(String[] args) {
MyThread2 mt = new MyThread2();
Thread t = new Thread(mt);
// 启动线程
t.start();
for (int i = 0; i < 5; i++) {
System.out.println("主线程---->" + i);
}
}
}
// 这并不是一个线程类,是一个可运行的类,它还不是一个线程
class MyThread2 implements Runnable{
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println("分支线程--->" + i);
}
}
}
运行结果:
分支线程--->0
分支线程--->1
主线程---->0
分支线程--->2
主线程---->1
分支线程--->3
分支线程--->4
分支线程--->5
分支线程--->6
分支线程--->7
分支线程--->8
主线程---->2
分支线程--->9
主线程---->3
主线程---->4
使用匿名内部类方式:
/**
* 采用匿名内部类方式创建线程对象
*/
public class ThreadTest03 {
public static void main(String[] args) {
Thread t = new Thread(new Runnable() {
@Override
// 支线程
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("分支线程--->" + i);
}
}
});
// 启动线程
t.start();
// 主线程
for (int i = 0; i < 50; i++) {
System.out.println("主线程--->" + i);
}
}
}
运行结果:
主线程--->0
分支线程--->0
主线程--->1
主线程--->2
主线程--->3
分支线程--->1
主线程--->4
分支线程--->2
分支线程--->3
分支线程--->4
分支线程--->5
分支线程--->6
分支线程--->7
分支线程--->8
分支线程--->9