分享

Java 多线程的三种实现方法

 印度阿三17 2019-03-04

Java SE高级开发——多线程的实现

进程与线程的概念:
进程:操作系统中,一个程序的执行周期称为一个进程
线程:一个程序同时执行多个任务的时候,我们把每一任务称作一个线程

进程与线程相比较,线程更”轻量级“,创建、撤销一个线程比启动一个进程开销要小的多。但是,没有进程就没有线程,进程一旦终止,其内的线程也不再存在。

多线程与多进程的区别:
每个进程都拥有自己的完整变量,而线程之间则共享数据。共享数据使得线程间通信更加方便、有效。

多线程实现:

1、继承Thread类实现多线程

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 class ThreadTest {
    public static void main(String[] args) {
        MyThread myThread1 = new MyThread("线程1");//创建新线程
        MyThread myThread2 = new MyThread("线程2");
        MyThread myThread3 = new MyThread("线程3");
        myThread1.run();//启动线程
        myThread2.run();
        myThread3.run();
    }
}

运行结果:
在这里插入图片描述
由运行结果可以看出,此时线程只是按顺序打印,并没有多线程的共享数据的性质,所有我们要特别注意:启动线程需要使用start()方法。

public static void main(String[] args) {
	MyThread myThread1 = new MyThread("线程1");
	MyThread myThread2 = new MyThread("线程2");
	MyThread myThread3 = new MyThread("线程3");
	myThread1.start();
	myThread2.start();
	myThread3.start();
}

此时线程变为交替执行
在这里插入图片描述
2、Runable实现多线程

class MyThread implements Runnable{
    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 class ThreadTest {
    public static void main(String[] args) {
        MyThread myThread1 = new MyThread("线程1");
        MyThread myThread2 = new MyThread("线程2");
        MyThread myThread3 = new MyThread("线程3");
        new Thread(myThread1).start();
        new Thread(myThread2).start();
        new Thread(myThread3).start();
    }
}

在这里插入图片描述
注意:实现Runnable接口比继承Thread类所具有的优势:
a、从形式上来说,可以避免Java中的单继承局限

b、使用Runnable实现的多线程的程序类可以更好的描述出程序共享的概念

3、Callable实现多线程

class MyThread implements Callable<String>{
    private int tickets = 10;

    @Override
    public String call() throws Exception {
        while (this.tickets >= 0){
            System.out.println("剩余票数为:" this.tickets--);
        }
        return "票卖完了";
    }
}

public class ThreadTest {
    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());
    }
}

通过继承Callable来实现多线程的特点:可以取得线程执行结果,具有返回值
在这里插入图片描述

来源:http://www./content-1-130451.html

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多