线程的创建与启动
在 Java 中,创建一个线程就是创建一个 Thread 类(子类)的对象(实例).
Thread 类有两个常用的构造方法:Thread()与 Thread(Runnable).对应的创建线程的两种方式:
定义 Thread 类的子类
定义一个 Runnable 接口的实现类
这两种创建线程的方式没有本质的区别
Mythread.java
package com.dym.juc;
/*
* 1) 定义类,继承Thread
* */
public class Mythread extends Thread{
// 2)重写run方法
// run() 方法体中的代码就是子线程要执行的任务
@Override
public void run() {
System.out.println("这个是子线程打印的内容");
}
}
MyThreadTest.java
package com.dym.juc;
public class MyThreadTest {
public static void main(String[] args) {
System.out.println("JVM 启动main线程,mian线程执行mian方法");
//3)创建子线程对象
Mythread thread = new Mythread();
//4)启动线程
thread.start();
/*
* 调用线程的start()方法来启动线程,
* 启动线程的实质就是请求JVM运行相应的线程
* 这个线程具体在什么时候运行由线程调度器(scheduler)决定
*注意:start()方法调用结束 并不意味这子线程开始运行
* 新开启的线程会执行run方法
* 如果开启了多个线程,start()方法调用顺序并不一定就是线程启动的顺序
* 多线程的运行结果与代码的执行顺序或调用顺序无关
* */
System.out.println("main线程后面其他的代码……");
}
}
多线程运行结果是随机的
Mythread2.java
package com.dym.juc;
public class Mythread2 extends Thread{
@Override
public void run() {
for (int i = 1; i <=10 ; i++) {
System.out.println("sub thread:"+i);
int time= (int) (Math.random()*1000);
try {
Thread.sleep(time); //线程睡眠,单位是毫秒
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
MyThreadTest2.java
package com.dym.juc;
/*
* 演示线程运行结果的随机性
* */
public class MyThreadTest2 {
public static void main(String[] args) {
Mythread2 mythread2 = new Mythread2();
mythread2.start(); //开启了子线程
//当前是main线程
for (int i = 1; i <=10 ; i++) {
System.out.println("main:"+i);
int time= (int) (Math.random()*1000);
try {
Thread.sleep(time); //线程睡眠,单位是毫秒
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}