一 概述
一个进程只有一个至少会运行一个线程,Java中同样存在这样,在调用main方法的时候,线程又JVM所创建。
1 package link.summer7c.test; 2 3 public class Test{ 4 public static void main(String[] args){ 5 System.out.println(Thread.currentThread().getName()); 6 } 7 }
运行结果:main
叫做main的线程正在执行main()方法中的代码。但是main和main方法并没有什么关系,只是因为名字相近而已。
二 Java多线程的实现
Java的JDK中,实现多线程有两种方法,一种是继承Thread类,另一种是实现Runnable接口。
继承Thread方法:
1 package link.summer7c.test; 2 3 public class Test extends Thread{ 4 public void run(){ 5 super.run(); 6 System.out.println("The Test!"); 7 } 8 public static void main(String[] args){ 9 Test test=new Test(); 10 test.start(); 11 System.out.println(Thread.currentThread().getName()); 12 } 13 }
运行结果:
main
The Test!
按照程序来看,应该先输出The Test。在输出main,但是结果却不是如此这就说明在运行多线程的时候运行结果和代码的顺序是没有关系的。
所以,线程是一个子任务,CPU是以不确定的方式来执行的。
然后再看看Thread的源代码:
1 public class Thread implements Runnable
说明Thread类实现了Runnable类,他们之间有多态关系。
验证线程的随机性可以在运行两个线程,同时循环输出,则会发现两个线程并不是顺序执行:
1 package link.summer7c.test; 2 3 public class Test{ 4 public static void main(String[] args){ 5 MyThread myThread=new MyThread(); 6 myThread.setName("MyThreadRun"); 7 myThread.start(); 8 for(int i=0;i<10;i++){ 9 System.out.println("main="+Thread.currentThread().getName()); 10 } 11 } 12 } 13 14 class MyThread extends Thread{ 15 public void run(){ 16 for(int i=0;i<10;i++){ 17 System.out.println("run="+Thread.currentThread().getName()); 18 } 19 } 20 }
结果:
main=main run=MyThreadRun run=MyThreadRun main=main run=MyThreadRun main=main run=MyThreadRun main=main run=MyThreadRun main=main run=MyThreadRun main=main run=MyThreadRun main=main run=MyThreadRun main=main run=MyThreadRun main=main run=MyThreadRun main=main
start方法不是启动程序的方法,所有的start是并发执行的。
实现Runnable接口:
1 package link.summer7c.test; 2 3 public class Test{ 4 public static void main(String[] args){ 5 Runnable myThread=new MyThread(); 6 Thread theThread=new Thread(myThread); 7 theThread.start(); 8 System.out.println("Main Run!"); 9 } 10 } 11 12 class MyThread implements Runnable{ 13 @Override 14 public void run() { 15 System.out.println("线程运行!"); 16 } 17 18 }
从这里可以看出来,实现了Runnable接口之后还是要new一个Thread对象,这里我很疑惑,既然Runnable是多线程的接口为什么没有start方法呢,接下来我看了源码:public
interface Runnable {
public abstract void run();
}
原来Runnable接口中没有start,所以start的方法是在Thread中写出来的,所以我又看了Thread的源代码,发现了start方法。
1 start0();
在strat方法中调用了start0方法,这个方法是这样写的:
private native void start0();
可以看出,这个方法已经涉及到了操作系统的接口了,很可能是用C/C++写出来的,这里就不深入探究了。
=========================================