start和run的区别

时间:2025-04-19 07:28:46

本方法通过实现runnable接口来实现多线程,刚开始被run()和start()搞糊涂了,后来看了很多博客,稍有感悟。所以写一下自己的理解。start()方法让一个线程进入就绪队列等待分配cpu,分到cpu后才调用实现的run()方法。

若不使用start()直接在main方法中直接使用run()方法, 比如下面程序的前两种情况,因为没有开辟新的线程,所以当前线程是main线程,而第三种情况,开辟了一个新线程且线程名我们设置为了“新线程”,在cpu执行新线程时会调用run()方法。

package javaNewThread;
public class test1main {
	public static void main(String[] args) {
		runnable runner=new runnable();
		Thread th1= new Thread(runner,"新线程");
		
//区分以下三种情况
        
        //1
		("():");
		();
		//2
		("():");
		();
		//3
		("():");
		();
	}
}
public class runnable implements Runnable{
	private int food=10;
	public void run() {
		for(int i=0;i<3;i++) {
			("线程名:"+().getName()+" food:"+food--);
		}
	}
}

结果:

():
线程名:main food:10
线程名:main food:9
线程名:main food:8
():
线程名:main food:7
线程名:main food:6
线程名:main food:5
():
线程名:新线程 food:4
线程名:新线程 food:3
线程名:新线程 food:2

------------交换123的顺序,查看运行结果

接下来我把3放到1和2前面执行,发现新线程的run()还是最后执行,说明它在就绪队列中排队,并没有这么快执行。而当前正在执行mian线程,每个线程执行都有一个时间片,main线程时间片还没结束,所以23先执行了。等main线程时间片用完,再执行新线程。

package javaNewThread;
public class test1main {
	public static void main(String[] args) {
		runnable runner=new runnable();
		Thread th1= new Thread(runner,"新线程");
		
        //1,原来的3
		("():");
		();
	    //2
		("():");
		();
		//3
		("():");
		();
	}
}
package javaNewThread;

public class runnable implements Runnable{
	private int food=10;
	public void run() {
		for(int i=0;i<3;i++) {
			("线程名:"+().getName()+" food:"+food--);
		}
	}
}

运行结果:

():
():
线程名:main food:10
线程名:main food:9
线程名:main food:8
():
线程名:main food:7
线程名:main food:6
线程名:main food:5
线程名:新线程 food:4
线程名:新线程 food:3
线程名:新线程 food:2