多线程 -- 多线程的实现

概念及二者区别与联系

  • 进程就是操作系统中一个程序的执行周期
  • 线程:一个程序同时执行多个任务;通常来讲,每一个任务就称为一个线程
  • 创建,撤销一个线程比启动,撤销一个进程开销要小得多
  • 一个进程中所有的线程共享该进程的所有资源
  • 没有进程就没有线程,进程一旦终止,线程也将不存在
  • 线程依托进程提供的资源,无法独立申请操作系统资源

多线程的实现

继承Thread类实现多线程

  • java.lang.Thread是线程操作的核心类
  • 新建一个线程最简单的方法就是直接继承Thread类而后覆写run()方法
  • 但是无论哪种方式实现多线程,本质上启动一定调用Thread类提供的start()方法
  • 线程的start()方法只能调用一次
多次调用会报错java.lang.IllegalThreadStateException

线程主要调用流程:
start(java方法)  -> start0(JVM)  ->  进行资源调度  ,系统分配(JVM) 
 ->  run(java方法)执行线程的具体操作任务
  • 代码展示如下:
class MyThread extends Thread {
    private String title;

    public MyThread(String title) {//线程主体类
        this.title = title;
    }
    public void run(){//所有线程从此处开始
        for(int i = 0;i<10;i++){
            System.out.println(this.title+",i =" +i);
        }
    }
}
public class Test{
    public static void main(String[] args) {
        MyThread myThread = new MyThread("张三");
        MyThread myThread1 = new MyThread("李四");
        MyThread myThread2 = new MyThread("王一");
        myThread.start();
        myThread1.start();
        myThread2.start();
    }
}

实现Runnable接口来实现多线程

  • 用接口实现之后,解决了单继承局限问题;但是没有start()方法被继承了。那么此时就需要关注Thread类提供的构造方法public Thread(Runnable target)
class MyThread implements Runnable{
    private String title;
    public MyThread(String title) {//线程主体类
        this.title = title;
    }
    public void run(){//所有线程从此处开始
        for(int i = 0;i<10;i++){
            System.out.println(this.title+",i =" +i);
        }
    }
}
public class Test{
    public static void main(String[] args) {
        MyThread myThread = new MyThread("张三");
        MyThread myThread1 = new MyThread("李四");
        MyThread myThread2 = new MyThread("王一");
        new Thread(myThread).start();
        new Thread(myThread1).start();
        new Thread(myThread2).start();
    }
}
Thread与Runnable关系与区别
  • Thread类与自定义线程类(实现了Runnable接口),是一个典型的代理设计模式;Thread类负责辅助真实业务操作(资源调度,创建线程并启动);自定义线程负责真实业务的实现(run方法具体做啥事)
  • 使用Runnable接口实现的多线程程序类,可以更好的描述共享的概念

Callable实现多线程

  • 从JDK1.5开始追加了新的开发包:java.uti.concurrent(这个开发包主要是进行高并发编程使用的),包含很多在高并发操作中会使用的类。这个包里定义一个新的接口Callable
  • Runnable中的run()方法没有返回值
  • 因此,当线程有返回值时,只能利用Callable来实现多线程
  • 实现Callable接口,覆写call()方法,有返回值V call() throws Exception;
  • 使用Callable定义线程主体类
class MyThread implements Callable<String>{
    private int ticket = 10;
    public String call() throws Exception{
        while(this.ticket > 0){
            System.out.println("剩余票数:"+this.ticket--);
        }
        return "票买完了。";
    }
}
  • 不管何种情况,如果要启动多线程,只有Thread类中的start()方法
  • 而启动并取得多线程的执行结果
public class Test{
    public static void main(String[] args)throws InterruptedException,ExecutionException {
        FutureTask<String> task =  new FutureTask<>(new MyThread());
        new Thread(task).start();
        new Thread(task).start();
        System.out.println(task.get());
    }
}

猜你喜欢

转载自blog.csdn.net/WZL995/article/details/83895471