`
javandroid
  • 浏览: 23348 次
  • 性别: 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>
分享到:
评论

相关推荐

    Linux下的多线程编程.pdf

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

    易编远航第一期-第九套多线程幻想神域实战视频

    多线程实战之副本寻路实现思路 3.多线程实战之副本打怪判断 4.多线程实战之寻路打怪实战 5.多线程实战之退出副本判断(补充传参) 第四章(特色功能) 1.多线程实战之自动钓鱼思路分析 2.多线程实战之自动钓鱼...

    Java多线程实现生产者消费者

    编写一个“生产者-消费者”的多线程演示程序,两个生产者,一个消费者,可以存放产品的仓库容量为10,仓库用栈实现,并有同步功能,且能防止先消费后生产的情况。

    Linux多线程 C语言编程关于多线程

    csdn Linux 下的多进程编程初步 摘要:多线程程序设计的概念早在六十年代就被提出,但直到八十年代中期,Unix 系 ...和早期的Windows 不同,Unix/Linux 系统是真正实现多任务操作的系统,可以说,不使. . . ./ .

    VB.NET可以很容易实现多文件多线程同时下载

    用VB6折腾了很久,很难实现多文件同时下载,虽然也说VB6支持异步操作,但是不能真正的多个文件同时下载,也就是说实现不了真正意义上的多线程同时工作,用Inet控件观察了好久,总是一个一个的下载。无奈之下,只好...

    C#多线程之如何弹出一个模式窗口来显示进度条

    C#多线程之如何弹出一个模式窗口来显示进度条 学习版

    Java 利用多线程实现文件的分片下载

    刚学完多线程和线程池,以及线程爱好者。 使用场景及目标: 大文件的快速下载,经测试在100M带宽的网络下,下载一个40M的文件,不超过两秒钟,当然还得根据自己电脑的配置来讲。 其他说明: 文件如果特别小,而...

    Linux下基于多线程的服务器程序设计.pdf

    在实现多线程服务器程序时,需要根据实际情况选择合适的线程模型和同步机制,确保服务器的稳定性和可靠性。 基于Linux下的多线程服务器程序设计方法可以提高服务器的并发能力和响应速度,广泛应用于服务器领域。该...

    c++多线程编程初学实例一

    c++ 多线程编程之一——问题提出 后面还有二三四哈

    Java多线程服务器编程

    简单的多线程服务器实现,东北大学网络实验之一

    Java多线程之基础篇(一).docx

    与此相反,像java所使用的这种并发系统会共享内存或I/O这样的资源,因此编程编写多线程程序最基本的困难在于,协调不同线程驱动的任务之间这些资源的使用,以便使得这些资源不会同时被多个任务访问。

    Java多线程之进阶篇(一).docx

    与此相反,像java所使用的这种并发系统会共享内存或I/O这样的资源,因此编程编写多线程程序最基本的困难在于,协调不同线程驱动的任务之间这些资源的使用,以便使得这些资源不会同时被多个任务访问。

    基于Linux的多线程池并发Web服务器设计.pdf

    多线程池技术是解决并发问题的有效方法之一。该技术可以实现高效的资源调度和共享,降低线程开销,提高系统访问速度和资源利用率。本文的设计基于 Linux操作系统,使用多线程池技术,实现了高效的Web服务器设计。 ...

    c#多线程抓取网页内容

    如果不成功,内容列仍为空,作为是否再次下载的依据之一,如果反复不成功,则进程将于达到重试次数(对应该地址被申请的次数,用户可设)后,申请下一个Url地址。主要的代码如下(以VFP为例): &lt;建立表&gt; CREATE ...

    C++网络编程实例文件之第十章 多线程网络文件传输的设计与实现

    C++网络编程实例文件,里面包含各个章节的C++源码。 第一章 网络通信基础 第二章 认识Windows编程模型...第十章 多线程网络文件传输的设计与实现 第十一章 防火墙的设计与实现 第十二章 邮件转发器 第十三章 telnet bbs

    Linux中基于缓冲式多线程的文件传输程序.pdf

    通过多线程技术,可以实现多个文件的同时传输,提高文件传输的速度和效率。 此外,本文档还对 HTTP 协议进行了介绍。HTTP 协议是基于 TCP/IP 协议的应用层协议,通过 HTTP 协议,可以实现文件的传输。HTTP 协议的...

    java多线程与并发库高级处理.txt

    用多线程只有一个目的,那就是更好的利用cpu的资源,因为所有的多线程代码都可以用单线程来实现。说这个话其实只有一半对,因为反应“多角色”的程序代码,最起码每个角色要给他一个线程吧,否则连实际场景都无法...

    Java多线程示例之线程控制

    Java多线程两个例子,一个是自定义线程池方法实现多线程运行个数的控制,可以解决多线程内存不足的问题。另一个是利用线程通信,读写先关的典型实例

    多线程下载技术论文.rar

    如果N个用户的优先级都相同,那么每个用户连接到该服务器上的实际带宽就是服务器带宽的N分之一。如果户数目较多,则每个用户只能占有可怜的一点带宽,下载将会是个漫长的过程。 具体研究内容:下载功能实现,包括单...

    JAVA多线程游戏之简易飞机大战

    本人利用JAVA的swing和多线程实现的一个简易飞机大战游戏,功能比较简单,不过可拓展性较高。分享给大家!

Global site tag (gtag.js) - Google Analytics