package thread; public class Thread1 extends Thread { private String name; public Thread1(String name) { this.name=name; } public void run() { for (int i = 0; i < 5; i++) { System.out.println(name + "运行 : " + i); try { sleep((int) Math.random() * 100); // Math.random()产随机数 0间 再乘3000;前面int呢 乘3000随机数强制转换int类型 再调用Thread.sleep(time)函数 让线程休眠time毫秒// } catch (InterruptedException e) { e.printStackTrace(); } } }
首先创建一个类继承线程的类
package thread; public class Main { public static void main(String[] args) { Thread1 mTh1=new Thread1("A"); Thread1 mTh2=new Thread1("B"); mTh1.start(); mTh2.start(); //两个进程同时在main函数中运行时没有时间先后的顺序。 //每一次运行都是随机的部分时间先后 } } 在main函数中调用线程类输出结果如下
输出:
A运行 : 0 B运行 : 0 A运行 : 1 A运行 : 2 A运行 : 3 A运行 : 4 B运行 : 1 B运行 : 2 B运行 : 3 B运行 : 4
再运行一下:
A运行 : 0 B运行 : 0 B运行 : 1 B运行 : 2 B运行 : 3 B运行 : 4 A运行 : 1 A运行 : 2 A运行 : 3 A运行 : 4
说明:
程序启动运行main时候,java虚拟机启动一个进程,主线程main在main()调用时候被创建。随着调用MitiSay的两个对象的start方法,另外两个线程也启动了,这样,整个应用就在多线程下运行。
注意:start()方法的调用后并不是立即执行多线程代码,而是使得该线程变为可运行态(Runnable),什么时候运行是由操作系统决定的。
从程序运行的结果可以发现,多线程程序是乱序执行。因此,只有乱序执行的代码才有必要设计为多线程。
Thread.sleep()方法调用目的是不让当前线程独自霸占该进程所获取的CPU资源,以留出一定时间给其他线程执行的机会。
实际上所有的多线程代码执行顺序都是不确定的,每次执行的结果都是随机的。
但是start方法重复调用的话,会出现java.lang.IllegalThreadStateException异常