`
javandroid
  • 浏览: 25550 次
  • 性别: Icon_minigender_1
文章分类
社区版块
存档分类
最新评论

多线程之一 实现多线程的方式

 
阅读更多

实现多线程的方式

一、使用Thread实现多线程

定义一个任务,用Runnable来描述。

//打印任务
class PrintRunnable implements Runnable {
    private int num=0;

    public void run() {
        boolean isfinished=false;
        while(!isfinished){
            if(num==200){//i为200时结束
                isfinished=true;
                break;
            }
            System.out.println(num++);
        }
    }
}

调用方式

    public static void main(String[] args){
        Thread thread =new Thread(new PrintRunnable());
        thread.start();
    }

二、使用Executors和Future实现多线程

    public static void main(String[] args){ 
        //产生线程池     
        ExecutorService exec = Executors.newSingleThreadExecutor();     
        //ExecutorService exec = Executors.newCachedThreadPool();       
        //ExecutorService exec = Executors.newFixedThreadPool(5);

        //执行任务
        exec.execute(new PrintRunnable());      
        //关闭
        exec.shutdown();
    }

三、实现带返回结果的多线程

定义带返回结果的任务,用Callable描述。

//并返回结果的打印任务
class PrintCallable implements Callable<Integer>{
    private int num=0;

    @Override
    public Integer call() throws Exception {        
        boolean isfinished=false;
        while(!isfinished){
            if(num==200){//i为200时结束
                isfinished=true;
                break;
            }
            System.out.println(num++);
        }
        //返回结果
        return num;
    }
}

调用方式

    public static void main(String[] args){ 
        //产生线程池     
        ExecutorService exec = Executors.newSingleThreadExecutor();     
        //ExecutorService exec = Executors.newCachedThreadPool();       
        //ExecutorService exec = Executors.newFixedThreadPool(5);

        //执行任务
        exec.execute(new PrintRunnable());      
        //关闭
        exec.shutdown();

        //提交并执行带返回结果的任务
        Future<Integer> future = exec.submit(new PrintCallable());

        try {
            //获取返回结果.get方法会阻塞,直到结果返回
            System.out.println(future.get());
            System.out.println(future.get(5, TimeUnit.MINUTES));//指定超时时间5s
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        } catch (TimeoutException e) {
            e.printStackTrace();
        }
    }

几种方式的比较

尽量不直接使用线程,因为线程既充当的工作单元,又是执行机制。而使用Execute则将工作单元和执行机制优雅的分开了。工作单元指的是任务(task),包括Runnable任务和Callable任务。

选择哪种线程池

Executors.newCachedTheadPool:
对于小程序和轻载的服务器,我们可以使用它是个不错的选择
Executors.newFixedThreadPool:
对于大负载的服务器来说,缓存的线程池就不是很好的选择了!在缓存的线程池中,被提交的任务没有排成队,而是直接交给线程执行。如果没有线程可用,则创建新的线程,如若如武器负载较重,以致它所有的cpu都完全被占用,当有更多任务时,则会创建更多的线程,情况则会变得更糟。因此,在大负载的产品服务器中,最好使用Executors.newFixedThreadPool。或者为了最大限度的控制它,可以直接使用ThreadPoolExecutor类。
Executors.newSingleThreadExecutor:
对于在希望在另一个线程中连续运行的事物(长期存活的任务)来说,都是很有用的,例如监听进入的socket连接的任务。对希望在线程中运行的段任务也同样方便。例如,更新本地或远程日志的小任务,或者是事件分发线程。

本文参考了《java编程思想》第4版和《Effective Java中文版》第2版

<script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('<ul/>').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('<li/>').text(i)); }; $numbering.fadeIn(1700); }); }); </script>
分享到:
评论

相关推荐

    java多线程应用实现示例

    本示例着重探讨如何在Java中实现多线程,并通过一个具体的小球运动模拟来阐述相关概念。 一、多线程基础 多线程是指在一个进程中可以存在多个并发执行的线程。Java提供了两种方式创建线程:继承Thread类或实现...

    多线程实现服务端

    在IT领域,多线程是实现高性能服务器的关键技术之一。多线程允许一个应用程序同时执行多个不同的任务,从而提高效率,特别是在处理并发连接时。在这个场景下,"多线程实现服务端"指的是通过创建和管理多个线程来构建...

    多线程_按键精灵经典多线程操作_

    标题“多线程_按键精灵经典多线程操作_”表明我们将探讨的是如何在按键精灵这款自动化工具中实现多线程的功能。按键精灵是一款功能强大的自动化软件,它可以模拟用户的键盘和鼠标操作,执行一系列预定义的任务,如...

    java多线程之赛马程序实验8多线程练习下载进度

    本实验"java多线程之赛马程序实验8多线程练习下载进度"聚焦于如何利用多线程来模拟实际场景中的下载进度显示。在这一过程中,我们将探讨Thread类的`run`和`start`方法,以及如何通过进度条来可视化表示下载过程。 ...

    多线程实现P2P服务器

    在IT行业中,多线程是实现高性能和高并发的关键技术之一。在P2P(对等网络)服务器的实现中,多线程更是扮演着至关重要的角色。P2P网络是一种分布式系统,其中每个节点既是服务提供者也是服务消费者,这使得多线程...

    基于Qt实现的多线程客户端与服务器

    【基于Qt实现的多线程客户端与服务器】项目是一个典型的分布式系统应用,它结合了Qt库、C++编程语言和多线程技术,用于构建一个高速公路智能收费系统。在这个系统中,多线程技术被用来提升程序的并发处理能力,确保...

    python多线程同步之文件读写控制

    在Python编程中,多线程同步对于文件读写控制至关重要,因为如果不加以控制,多个线程同时访问同一文件可能会导致数据不一致或者错误。这里我们将深入探讨如何在Python中使用多线程同步来确保文件读写的安全性。 ...

    多线程实现动态数组的相乘

    在IT领域,尤其是在计算机科学与软件工程中,多线程技术是提高程序执行效率和响应速度的关键手段之一。本文将深入探讨如何利用多线程实现动态数组的相乘,这是一项涉及并行计算的重要技能,尤其适用于处理大规模数据...

    多线程编程之一 介绍+例程

    标题“多线程编程之一 介绍+例程”暗示我们将从基础出发,逐步揭示多线程编程的核心原理,并通过实际的代码示例来辅助理解。 首先,我们需要了解什么是多线程编程。在单线程环境中,程序按照顺序执行任务。而在多...

    多线程实现ftp客户端程序

    开发人员可能会使用如Python的`threading`库或Java的`java.util.concurrent`包来实现多线程。他们还可能使用FTP相关的库,如Python的`ftplib`或Java的`jsch`,来与FTP服务器进行通信。 总的来说,多线程实现的FTP...

    DOS下多线程的实现程序代码

    在这样的环境下实现多线程,通常需要通过一些特定的技术和编程技巧来模拟多线程行为。 标题"**DOS下多线程的实现程序代码**"指的是开发者通过某种方式在DOS系统中实现了多线程的编程模型,使得一个应用程序能够同时...

    Linux下的多线程编程.pdf

    多线程编程的优点之一是它是一种非常“节俭”的多任务操作方式。与进程相比,多线程的优点之一是它可以节约系统资源,一个进程的开销大约是一个线程开销的30倍左右。另外,多线程之间的通信机制也非常方便,多个线程...

    单线程与多线程的区别

    相比之下,**多线程**允许程序同时执行多个线程,每个线程可以独立地执行任务。这使得程序能更有效地利用CPU资源,提高响应速度和并发能力。例如,在一个多线程应用中,一个线程可以处理用户输入,而另一个线程则...

    多线程实现冒泡,快速排序

    实验通过创建线程来实现多线程排序,具体的线程创建函数定义如下: ```cpp DWORD WINAPI BubbleThread(LPVOID n); DWORD WINAPI QuickThread(LPVOID n); ``` 每个线程分别调用冒泡排序和快速排序函数来对数组进行...

    用户级线程的介绍,怎样实现多线程等等

    实现多线程的方式有多种,例如在一个servlet中全局保存请求,然后由单例servlet处理,或者将请求放入队列,由单线程调度处理。 用户级线程(User-Level Threads, ULTs)是由应用程序或线程库负责管理和调度的线程,...

    基于Java的多线程网络爬虫设计与实现.txt

    本文档探讨了在Java环境下设计与实现多线程网络爬虫的技术细节与实践方法。网络爬虫(Web Crawler),是一种自动抓取互联网上网页信息的程序或自动化脚本,其主要任务是遍历整个网站或特定网页集合,提取所需数据并...

    qt 线程池实现多线程下载

    本篇文章将深入讲解如何使用Qt的线程池实现多线程HTTP下载,并涵盖限速下载及进度显示的相关知识。 首先,我们要了解Qt中的线程池(QThreadPool)机制。QThreadPool是Qt提供的一个管理线程资源的类,它可以调度和...

    JAVA单线程多线程

    `synchronized`是Java中用于实现线程同步的关键字之一。它可以用来修饰方法或者代码块,确保被修饰的代码在同一时刻只能被一个线程访问。这是Java实现线程安全的一种基本手段。 ##### 使用synchronized修饰方法 当...

    pb真正的多线程,用createthread创建的多线程.rar

    描述中提到的“纯pb代码,多线程处理”意味着这个压缩包中包含的PowerBuilder源代码是专门用来演示或实现多线程处理的。在PowerBuilder应用中,通常使用事件驱动的方式来编写代码,但当需要同时进行多个耗时操作时,...

    Delphi多线程详解

    在Delphi这样的集成开发环境中,多线程编程是开发者需要掌握的关键技能之一。本文将深入探讨Delphi中的多线程概念、实现方式以及常见问题。 一、多线程基础 多线程意味着在一个程序中存在多个并发执行的线程。每个...

Global site tag (gtag.js) - Google Analytics