一、话题导入
在开始简述Java多线程机制之前,我不得不吐槽一下我国糟糕的IT界技术分享氛围和不给力的互联网技术解答深度。当一个初学java的小哥向我请教Java多线程机制相关问题时,我让他去寻求度娘的帮助,让他先学会自己尝试解决问题;但是他告诉我在网上找不到他想要的信息,我也尝试性的在网上收刮了半天,也确实找不到内容详尽、表述清晰的文献。更遗憾的是某些也许有一定参考价值的文档都需要通过非正常手段下载,比如注册、回复甚至是花钱购买,这难免会让不少人望而却步,最后不了了之。
我并不是蓄意抨击,而是希望更多的人能够向Linux自由之父Stallman一样,学会奉献;如果大家都能够尝试去奉献,最终每个人也将更易于索取。
(以后得空将会陆续将Java各知识点归类总结,并放在CSDN个人博客中;出Java之外还考虑介绍下其他方面的内容,届时请保持关注哟^( 。。)^)
二、现实中的类似问题
假设你是某快餐店的老板,随着自己的苦心经营,终于让快餐店门庭若市、生意兴隆;为了拓展销路,你决定增加送餐上门服务,公司财务告诉你你可以为拓展此业务支配12万元,这个时候你会怎么支配这笔钱呢?
当然有很多种支配方式,并且在支配上需要考虑到人员数量、送餐范围、送餐形式等多个问题;这里我们集中讨论下送餐形式这个细节:
1)买一辆雪弗兰赛欧;
2)买15辆电瓶车;
除去员工工资等基本成本过后剩余的钱用于购买送餐工具,上面我给出了两种送餐交通工具,他们都有各自的优点:首先,雪弗兰赛欧能够达到更快的送餐速度,而且可以供应的送餐范围更广;其次,用电瓶车作为送餐交通工具可以同时为多个顾客派送,并且运送成本显然更加低廉。在这两者之间,你会作何选择呢?
显然是第二种送餐交通工具更加实用:相较之下,后者可以处理的顾客数量更多,靠后的顾客等待时间明显缩短。试想一下,如果你打了电话定了午饭,就因为你是第25个顾客,晚上六点才给你送来,你会是什么心情?
其实,快餐店老板选择多辆电瓶车进行送餐的考虑同进程选择多线程控制的思想是如出一辙的,单线程的程序往往功能非常有限,在某些特定领域甚至不能达到我们所期望的效能。例如,当你想让服务器数据能够被多个客户同时访问时,单线程将让这一设想化为泡影;单线程情况下,多个客户的需求将存入一个栈队,并且依次执行,靠后的客户很难有较好的访问体验。
Java语言提供了非常优秀的多线程支持,多线程的程序可以包含多个顺序执行流,且多个顺序执行流之间互不干扰。总的来说,使用多线程编程有如下多个优点:
1)多个线程之间可以共享内存数据;
2)多个线程是并发执行的,可以同时完成多个任务;
3)Java语言内置了多线程功能支持,从而简化了Java的多线程编程。
(1)继承Thread类:这种方式一般不常用,考虑到新建的线程类有继承其他父类的需要;
MyThread
(2)实现Runnable接口:最常用的方式
class MyThread implements Runnable{ @Overridepublic void run(){ //do something here } }
(3)实现Callable接口:这种方式用在需要返回结果值的场景下,实现Collable接口需要实现其call()方法
class MyThread implements Callable<String>{ @Override public String call() throws Exception{ //do something here return XXX; } } public class FutureMain{ public static void main(String[] args){ //构造FutureTask FutureTask<String> future = new FutureTask<String>(new MyThread()); Thread t1 = new Thread(future); t1.start(); //取得call()方法的返回值 System.out.println("返回值"+future.get()); } }
当然,除了基本的功能外,JDK还为Future提供了一些简单的控制功能:
boolean cancle(boolean mayInterruptIfRunning); //取消任务boolean isCancelled(); //是否已经取消boolean isDone(); //是否已完成
以上是有关java多线程讨论的详细内容。更多信息请关注PHP中文网其他相关文章!