栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java多线程的实现方式

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java多线程的实现方式

进程与线程

进程
       是指一个内存中运行的应用程序,每个进程都有一个独立的内存空间
线程
       是进程中的一个执行路径,共享一个内存空间,线程之间可以自由切换,并发执行. 一个进程最少有一个线程.线程实际上是在进程基础之上的进一步划分,一个进程启动之后,里面的若干执行路径又可以划分成若干个线程.

同步与异步

同步:排队执行 , 效率低但是安全.
异步:同时执行 , 效率高但是数据不安全.

因此,在很多实际开发中我们要用到多线程技术,我们需要知道如何在Java中创建多线程.

Java中多线程的几种创建方式: 

1.继承Thread类,重写run方法 

public class TestThread {

    public static void main(String[] args) {
        Thread thread = new MyThread();
        thread.start();
        for (int i = 0 ; i<100;i++){
            System.out.println(Thread.currentThread().getName()+"正在打印数字:"+i);
        }


    }

    public static class MyThread extends Thread{
        @Override
        public void run() {
           for (int i = 0 ; i<100;i++){
               System.out.println(Thread.currentThread().getName()+"正在打印数字:"+i);
           }
        }
    }

}

2.使用Thread类的有参构造函数,把Runnable接口的实现类作为构造器的参数

public class TestThread {

    public static void main(String[] args) {
        Runnable runnable = new MyRunnable();
        Thread thread = new Thread(runnable);
        thread.start();
        for (int i = 0 ; i<100;i++){
            System.out.println(Thread.currentThread().getName()+"正在打印数字:"+i);
        }


    }

    public static class MyRunnable implements Runnable{
        @Override
        public void run() {
           for (int i = 0 ; i<100;i++){
               System.out.println(Thread.currentThread().getName()+"正在打印数字:"+i);
           }
        }
    }

}
需要注意的是无论是第一种方法还是第二种方法,创建线程后调用的都是start方法,而非重写的run方法
   

3利用FutureTask和Callable实现多线程

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

public class TestThread {

    public static void main(String[] args) {
        Callable callable = new MyCallable();
        FutureTask futureTask = new FutureTask<>(callable);
        new Thread(futureTask).start();

        for (int i = 0 ; i<100;i++){

            System.out.println(Thread.currentThread().getName()+"正在打印数字:"+i);
        }


    }

    public static class MyCallable implements Callable {

        @Override
        public Integer call() throws Exception {

            for (int i = 0 ; i<100;i++){
            
                System.out.println(Thread.currentThread().getName()+"正在打印数字:"+i);
            }
            return -1;
        }
    }

}

Runnable 与 Callable的相同点
       都是接口
       都可以编写多线程程序
       都采用Thread.start()启动线程
Runnable 与 Callable的不同点
        Runnable没有返回值;Callable可以返回执行结果
        Callable接口的call()允许抛出异常;Runnable的run()不能抛出
        Callable获取返回值
        Callalble接口支持返回执行结果,需要调用FutureTask.get()得到,此方法会阻塞主进程的继续往下执行,如果不调用不会阻塞。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/306751.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号