您的位置:首页 > 编程语言 > Java开发

Java三种实现多线程的方式

2020-07-12 17:16 274 查看

一、继承Thread类

  1. 继承Thread类并重写run方法
  2. 调用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接口

  1. 实现Runnable接口并重写run方法
  2. 创建Runnable接口的实现类对象
  3. 创建线程对象,传入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步
。。。。。。。
。。。。。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: