java—多线程实现的三种方式

本文详细介绍了Java中实现多线程的三种方式:1) 继承Thread类,覆写run()方法,并通过start()启动线程;2) 实现Runnable接口,通过Thread对象的构造方法启动线程;3) 使用Callable接口,适用于需要获取线程执行结果的场景。每种方法的优缺点和使用示例均有说明。
摘要由CSDN通过智能技术生成
  1. 继承Thread实现多线程

    (1)直接继承Thread类,覆写run()方法。
    (2)覆写run()方法之后,不能使用实例化对象直接调用。应该调用Thread类中的start()方法启动线程。
    public synchronized void start()此方法会自动调用线程的run()方法。
    (3)注意:每一个线程只能启动一次,若重复启动,会产生异常,但是是一个RuntimeException异常。
    举例如下:
package www.fanfan.com;

public class MyThread extends Thread{
    private String title;

    public MyThread(String title) {
        this.title = title;
    }
@Override
    public  void run(){
        for (int i = 0; i < 10; i++){
            System.out.println(this.title+":i="+i);
        }
    }

    public static void main(String[] args) {
        MyThread myThread = new MyThread("hello");
        MyThread myThread1 = new MyThread("world");
        myThread.start();
        myThread1.start();
    }
}

  1. 实现Runnable接口实现多线程

    (1)Thread类的核心功能是进行线程的启动。
    如果一个类为了实现多线程直接去继承Thread类就会有但继承局限。
    在java中又提供有另外一种实现模式:Runnable接口。
    (2)但是Runnable接口中没有start()方法来启动多线程,就需要调用Thread中的start()方法。
    创建Thread的实例化对象调用start()方法;
    通过Thread的构造方法实例化对象:Thread中的存在构造方法Thread(Runnable target)。
    (3)Runnable接口对象可以使用三种方式定义
    1)对象实例化
    2)匿名内部类
    3)Lambda表达式
    具体实现:
    (1)实例化定义接口对象并且启动线程
package www.fanfan.com;

class MyThread1 implements Runnable{
    private String title;

    public MyThread1(String title) {
        this.title = title;
    }

    @Override
    public void run() {
        for (int i = 0;i < 5;i++){
            System.out.println(this.title+":i="+i);
        }
    }
}

public class MyThread1Test {
    public static void main(String[] args) {
        MyThread1 myThread1 = new MyThread1("张三");
        MyThread1 myThread2 = new MyThread1("李四");
        new Thread(myThread1).start();
        new Thread(myThread2).start();
    }
}

(2)使用匿名内部类定义接口对象并且启动线程

public class MyThread1Test {
    public static void main(String[] args) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("使用匿名内部了定义接口对象");
            }
        }).start();
    }
}

(3)使用Lambda表达式定义接口对象

public class MyThread1Test {
    public static void main(String[] args) {
        Runnable runnable = ()-> System.out.println("这是一个lambda定义idea接口对象");
        new Thread(runnable);
    }
}

  1. 使用Callable接口实现多线程

    (1)从JDK1.5开始追加了新的开发包:java.uti.concurrent。这个开发包主要是进行高并发编程使用的,包含很多在高
    并发操作中会使用的类。在这个包里定义有一个新的接口Callable.。

(2)线程执行结束后需要返回一些结果——此时需要使用Callable接口实现多线程。
具体使用:

package www.fanfan.com;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

class MyThread4 implements Callable{

    private int ticket = 10;
    @Override
    public String call() throws Exception {
        while (ticket > 0){
            System.out.println("剩余的票数:"+ticket--);
        }
        return "对不起,没有多余的票了";
    }
}
public class MyThreadTest4 {
    public static void main(String[] args) {
        FutureTask task = new FutureTask(new MyThread4());
        new Thread(task).start();
        new Thread(task).start();
        try {
            System.out.println(task.get());
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值