java多线程编程技术
程序员文章站
2024-02-16 10:26:40
...
start()与run()方法的区别
start():该方法是在当前线程中启动一个新的线程,而新启动的线程会调用run()方法,同时该方法不能重复调用;
run() :该方法和普通的方法一样,可以重复执行,不会创建新的线程。
1.线程调用得随机性:
创建一个自定义得线程类MyThread.java,此类继承自Thread,并且重写run方法。执行得代码如下:
/**
* @author renhuifeng
* @program: workThread->MyThread
* @description: 线程的调用得随机性
* @create: 2019-12-02 14:10
**/
public class MyThread extends Thread{
@Override
public void run(){
super.run();
System.out.println("Mythread");
}
}
class Test{
public static void main(String[] args) {
MyThread th = new MyThread();
th.start();
System.out.println("运行结束!");
}
}
总结:线程的再main方法n次不确定的调用输出结果得到了变化,证明线程调用时随机的。
2.演示过线程的调用的随机性后,演示线程的随机性
创建自定义线程类MyThread.java,代码如下:
package com.company;
/**
* @author renhuifeng
* @program: workThread->MyThread
* @description: 线程执行的随机性
* @create: 2019-12-02 14:10
**/
public class MyThread extends Thread{
@Override
public void run(){
for(int i =0;i<10;i++){
int time = (int) (Math.random()*1000);
try {
Thread.sleep(time);
System.out.println("run=" +Thread.currentThread().getName());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class Test{
public static void main(String[] args) {
MyThread th = new MyThread();
th.setName("myThread");
th.start();
for(int i =0;i<10;i++){
int time = (int) (Math.random()*1000);
try {
Thread.sleep(time);
System.out.println("main=" +Thread.currentThread().getName());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
在代码中,为了展现出线程具有随机特性,所以使用随机数的形式来使线程挂起的效果,从而表现出cpu执行哪个线程具有不确定性。
Thread.java 类中的start()方法通知“线程规划器”此线程已经准备就绪,等待调用线程对象的run()方法。这个过程其实就是让系统安排一个时间来调用Thread中run()方法,也就是使xain'cehng得到运行,启动线程,具有异步执行的效果。如果调用代码thread.run()就不是异步执行了,而是同步,那么此线程对象并不交给“线程规划器”来进行处理,而是由main主线程来调用run()方法,也就是必须等run()方法中代码执行完后才可以执行后面的代码。
另外注意是,执行start()方法的顺序不代表线程启动的顺序,创建测试代码如下:
public class MyThread extends Thread{
private int i;
public MyThread(int i) {
this.i = i;
}
@Override
public void run(){
System.out.println(i);
}
}
class Test{
public static void main(String[] args) {
MyThread th1 = new MyThread(1);
MyThread th2 = new MyThread(2);
MyThread th3 = new MyThread(3);
MyThread th4 = new MyThread(4);
MyThread th5 = new MyThread(5);
MyThread th6 = new MyThread(6);
MyThread th7 = new MyThread(7);
MyThread th8 = new MyThread(8);
MyThread th9 = new MyThread(9);
MyThread th10 = new MyThread(10);
th1.start();
th2.start();
th3.start();
th4.start();
th5.start();
th6.start();
th7.start();
th8.start();
th9.start();
th10.start();
}
}
执行结果: