Java实现多线程主要有两种方式,直接继承自Thread类,或者实现Runnable接口,后者实现较为灵活。
继承自Thread的实现如下:
import java.util.*;
class ThreadTest extends Thread
{
private String s;
public ThreadTest(String s)
{
this.s = s;
}
public void run() {
Random random = new Random();
while(true)
{
int t = (int)(random.nextDouble()*10000);
System.out.println("???"+s+" "+t);
try{
sleep(t);
}catch(InterruptedException e)
{
e.printStackTrace();
}
}
}
public static void main(String[] args)
{
new ThreadTest("1111").start();
new ThreadTest("2222").start();
new ThreadTest("3333").start();
System.out.println("Hello World!");
}
}
实现Runnable接口的实现如下:
import java.util.*;
class RunnableTest implements Runnable
{
private String s;
public RunnableTest(String s)
{
this.s = s;
}
public void run()
{
Random random = new Random();
int n = 0;
while(true)
{
if(n++>10)
break;
int t = (int)(random.nextDouble()*10000);
System.out.println("num = "+n+"; name="+s+"; sleeptime="+t);
try{
Thread.sleep(t);
}catch(InterruptedException e)
{
e.printStackTrace();
}
}
}
public static void main(String[] args) throws Exception
{
Thread t1 = new Thread(new RunnableTest("1111"));
Thread t2 = new Thread(new RunnableTest("2222"));
t1.start();
t2.start();
/*
单纯从代码上看,如果线程被生成了,但还未被起动,
调用它的join()方法是没有作用的。将直接继续向下执行,
因此,join必须在start调用后调用
*/
t1.join();
t2.join();
System.out.println("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
}
}