一、继承Thread类
- 继承Thread类并重写run方法
- 调用start方法来执行多线程
public class ThreadTest extends Thread{
//多线程
@Override
public void run() {
for (int i = 0; i < 200; i++) {
System.out.println("多线程正在运行 "+i);
}
}
public static void main(String[] args) {
//主线程
ThreadTest threadTest = new ThreadTest();
threadTest.start();//开起多线程
for (int i = 0; i < 200; i++) {
System.out.println("主线程正在运行"+i);
}
}
}
结果可以显示,两条线程是同步进行的
。。。
主线程正在运行5
主线程正在运行6
主线程正在运行7
多线程正在运行 0
多线程正在运行 1
多线程正在运行 2
多线程正在运行 3
多线程正在运行 4
主线程正在运行8
主线程正在运行9
主线程正在运行10
。。。
二、实现Runnable接口
- 实现Runnable接口并重写run方法
- 创建Runnable接口的实现类对象
- 创建线程对象,传入Runnable接口的实现类对象,调用start方法开起线程
public class RunnableTest implements Runnable{
//多线程
@Override
public void run() {
for (int i = 0; i < 200; i++) {
System.out.println("多线程正在运行 "+i);
}
}
public static void main(String[] args) {
//主线程
//创建Runnable接口的实现类对象
RunnableTest runnableTest = new RunnableTest();
//创建线程对象,通过线程对象来开启线程
// Thread thread = new Thread(runnableTest);
// thread.start();
//上面两行代码等效于
new Thread(runnableTest).start();
for (int i = 0; i < 200; i++) {
System.out.println("主程序正在运行"+i);
}
}
}
结果可以显示,两条线程是同步进行的
主程序正在运行0
多线程正在运行 0
主程序正在运行1
主程序正在运行2
主程序正在运行3
主程序正在运行4
多线程正在运行 1
主程序正在运行5
主程序正在运行6
。。。
三、实现Callable接口
public class CallableTest implements Callable<Void> {
//多线程实现类
@Override
public Void call(){
for (int i = 0; i < 20; i++) {
System.out.println(Thread.currentThread().getName()+"-->正在运行 "+i);
}
return null;
}
public static void main(String[] args) {
//创建三个线程
CallableTest t1 = new CallableTest();
CallableTest t2 = new CallableTest();
CallableTest t3 = new CallableTest();
//创建执行服务,线程池
ExecutorService ser = Executors.newFixedThreadPool(3);
//提交执行
ser.submit(t1);
ser.submit(t2);
ser.submit(t3);
//关闭服务
ser.shutdownNow();
}
}
结果可以显示,三条线程是同步进行的
pool-1-thread-1-->正在运行 0
pool-1-thread-2-->正在运行 0
pool-1-thread-2-->正在运行 1
pool-1-thread-2-->正在运行 2
pool-1-thread-2-->正在运行 3
pool-1-thread-2-->正在运行 4
pool-1-thread-2-->正在运行 5
pool-1-thread-2-->正在运行 6
pool-1-thread-3-->正在运行 0
pool-1-thread-2-->正在运行 7
pool-1-thread-2-->正在运行 8
pool-1-thread-2-->正在运行 9
pool-1-thread-1-->正在运行 1
。。。
四、多线程之一个龟兔赛跑示例
public class EgRun implements Runnable{
@Override
public void run() {
for (int i = 0; i <=100; i++) {
if (Thread.currentThread().getName().equals("兔子")&&(i>0&&i%40==0)){
//如果是兔子每跑40步
try {
Thread.sleep(5);//兔子休息5毫秒
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName()+"-->跑了"+i+"步");
if (i==100){
System.out.println(Thread.currentThread().getName()+"到大终点!");
}
}
}
public static void main(String[] args) {
EgRun egRun = new EgRun();
new Thread(egRun,"兔子").start();
new Thread(egRun,"乌龟").start();
}
}
结果
兔子-->跑了0步
乌龟-->跑了0步
兔子-->跑了1步
乌龟-->跑了1步
兔子-->跑了2步
乌龟-->跑了2步
乌龟-->跑了3步
兔子-->跑了3步
兔子-->跑了4步
兔子-->跑了5步
兔子-->跑了6步
。。。。。。。
。。。。。。。
乌龟-->跑了99步
乌龟-->跑了100步
乌龟到大终点!
兔子-->跑了40步
兔子-->跑了41步
兔子-->跑了42步
兔子-->跑了43步
兔子-->跑了44步
。。。。。。。
。。。。。。。