‘壹’ 什么是多线程,多线程编程的好处是什么
举个例子,你要做饭,你要做的饭是米饭和一个炒菜。
如果是单线程,那么你可以如下做:
第一种方法:先炒菜,然后开始蒸米饭;
第二种方法:先蒸米饭,等米饭熟了再炒菜;
如果是多线程,那么你就可以如下做:
先蒸米饭,在蒸米饭的过程中去炒菜。
有些问题的解决用多线程会提高效率,比如上边的例子。但是有时不会提高效率,反而会影响效率:
比如,你要洗衣服,还打算做家庭作业(假设你是小学生,老师给你布置的家庭作业)。
如果是单线程:你要么洗完衣服做作业,要么做完作业洗衣服。
如果是多线程:你洗一分钟衣服做一分钟作业,交叉进行,显然有些时间都耗在了任务的切换上了。
所以,多线程主要用于,当一个任务需要不占用资源的等待的时候,可以使用空闲的资源
‘贰’ 《java多线程编程核心技术》和《java并发编程的艺术》两本书的异同
区别很大:
《java多线程编程核心技术》:
这本书让你入个门,整体上了介绍一些并发编程的基本API、常见场景和一些坑,推荐先看这本书,比较简单,适合新手,但是原理不够深入
和《java并发编程的艺术》
这本书从底层和实现原理开始讲起,深入java内存模型和处理器的知识讲解并发编程的实现原理,适合有一定基础的人看
‘叁’ 多线程编程需要注意的几点
1、不要在子线程操作UI控件
2、如果你操作了,也绝对不能调用UpdateData来更新界面,否则程序Crash
3、这一条建立在第一条基础上---你在子线程操作UI控件,不可以让主线程等待某些条件(如等待子线程关闭,而子线程正在操作UI、等待进
入临界区,而子线程已经进入,并且操作UI),否则会出现假死...
4、最好方案:子线程操作数据,完成之后,通知主线程进行更新....
‘肆’ 有什么多线程编程的书推荐
Java并发编程实战 (豆瓣) (java并发的圣经)
多处理器编程的艺术 (豆瓣) (并发编程的各种算法,java实现,有点难度)
并发的艺术 (豆瓣) (多核处理器的共享内存模型中的各种算法)
Java虚拟机并发编程 (豆瓣) (jvm平台上各种语言的并发比较,如java,scala,clojure)
Java并发编程的艺术 (阿里专家方腾飞写的一本书)
Java 7并发编程实战手册 (豆瓣) (java中的并发编程实践,属于API工具书,指南)
Java多线程编程实战指南(设计模式篇) (豆瓣)
Java多线程编程核心技术 (豆瓣)
Java并发编程:核心方法与框架
实战Java高并发程序设计
七周七并发模型 (豆瓣) (七种并发模型的比较)
Go并发编程实战 (豆瓣)
C#并发编程经典实例 (豆瓣)
C#多线程编程实战 (豆瓣)
‘伍’ 多线程编程
HANDLE hThrd[3];
hThrd[0]= CreateThread();
hThrd[1]= CreateThread();
hThrd[2]= CreateThread();
WaitForMultiObjectex(hThrd,ture)即可。
具体参数你参看一下msdn就可以,挺简单的。
‘陆’ 做过多线程编程的请拿分!!!!
一楼的朋友还是没讲到要害上,楼主看过MSDN了,这点东西不可能不知道。
关于这个问题,我只谈谈我的看法:开始学习多线程的时候,我也有过很多问题和不解,不过随着实践的增加,也慢慢清晰了概念。
--------------------------------------------
线程是可执行的代码段,这点楼主一定认同。
而进程则只是一个环境而以,进程是不可以执行的,它只是为各各线程提供所需的资源共享。进程的产生必然会产生至少一个线程(至少会有一个主线程)。永远不会出现一个线程也没有的进程出现的情况。如果明确了这点,那么这个问题就很好理解了。
如果楼主用过CreateProcess的话就应该知道,它的第一个参数是一个可执行文件的全路径。而这个可执行文件被加载入内存后,CPU执行的第一条指令就是这个进程的主线程的入口点。其实占在C语言的角度来讲,就是main函数罢了。以后再调用CreateThread都是在main函数中调用的。如果没有main函数,你的程序根本不可能运行。
所以,多线程程序中的主线程是一个进程存在的必然条件,只要你写程序,就一定会有main函数,有了这个main函数,就有了主线程,所以主线程不需要回调地址(因为main是必然唯一存在的)。
-----------------------------
我又发留言给你了,你收到没有。收到了留言给我!
‘柒’ 《Java并发编程的艺术》epub下载在线阅读,求百度网盘云资源
《Java并发编程的艺术》(方腾飞)电子书网盘下载免费在线阅读
资源链接:
链接:
书名:Java并发编程的艺术
作者:方腾飞
豆瓣评分:7.4
出版社:机械工业出版社
出版年份:2015-7-1
页数:240
内容简介:
并发编程领域的扛鼎之作,作者是阿里和1号店的资深Java技术专家,对并发编程有非常深入的研究,《Java并发编程的艺术》是他们多年一线开发经验的结晶。本书的部分内容在出版早期发表在Java并发编程网和InfoQ等技术社区,得到了非常高的评价。它选取了Java并发编程中最核心的技术进行讲解,从JDK源码、JVM、CPU等多角度全面剖析和讲解了Java并发编程的框架、工具、原理和方法,对Java并发编程进行了最为深入和透彻的阐述。
《Java并发编程的艺术》内容涵盖Java并发编程机制的底层实现原理、Java内存模型、Java并发编程基础、Java中的锁、并发容器和框架、原子类、并发工具类、线程池、Executor框架等主题,每个主题都做了深入的讲解,同时通过实例介绍了如何应用这些技术。
作者简介:
方腾飞(花名清英,英文名kiral),
蚂蚁金服集团技术专家,从事Java开发近10年。5年以上的团队管理、项目管理和敏捷开发经验,崇尚团队合作。曾参与CMS、电子海图、SOC、ITIL、电子商务网站和信贷管理系统等项目。目前在蚂蚁金服网商银行贷款管理团队负责数据采集平台开发工作。与同事合作开发了tala code Review插件,深受阿里数千名工程师拥趸,并开发过开源工具jdbcutil(https://github.com/kiral/utils)。创办了并发编程网,组织翻译了百余篇国外优秀技术文章,并曾为InfoQ撰写“聊聊并发”专栏,在《程序员》杂志撰写敏捷实践系列文章
魏鹏,
阿里巴巴集团技术专家,在阿里巴巴中国网站技术部工作多年,曾担任中国网站交易平台架构师,主导了交易系统服务化工作,设计实现的数据迁移系统高效地完成了阿里巴巴中国网站交易数据到阿里巴巴集团的迁移工作。目前在阿里巴巴共享业务事业部从事Java应用容器Pandora和服务框架HSF的相关工作,其中Java应用容器Pandora是阿里巴巴中间件运行的基础,而服务框架HSF则是阿里巴巴集团实现服务化的主要解决方案,二者在阿里巴巴拥有最为广泛的使用量。个人平时喜欢阅读技术书籍,翻译一些国外优秀文档,喜欢总结、乐于分享,对Java应用容器、多线程编程以及分布式系统感兴趣。
程晓明,
1号店资深架构师,从事1号店交易平台系统的开发,技术上关注并发与NIO。因5年前遇到的一个线上故障,解决过程中对Java并发编程产生了浓厚的兴趣,从此开始了漫长的探索之旅:从底层实现机制、内存模型到Java同步。纵观我自己对Java并发的学习过程,是一个从高层到底层再到高层的一个反复迭代的过程,我估计很多读者的学习过程应该与我类似。文章多见诸《IBM developerWorks》、InfoQ和《程序员》杂志。
‘捌’ 什么是多线程编程
多线程编程技术是Java语言的重要特点。多线程编程的含义是将程序任务分成几个并行的子任务。特别是在网络编程中,你会发现很多功能是可以并发执行的。 比如网络传输速度较慢、用户输入速度较慢,你可以用两个独立的线程去完成这两个功能,而不影响正常的显示或其它功能。 多线程是与单线程比较而言的,普通的Windows采用单线程程序结构,其工作原理是:主程序有一个消息循环,不断从消息队列中读入消息来决定下一步所要干的事情,一般是针对一个函数,只有等这个函数执行完之后,主程序才能接收另外的消息来执行。比如子函数功能是在读一个网络数据,或读一个文件,只有等读完这个数据或文件才能接收下一个消息。在执行这个子函数过程中你什么也不能干。但往往读网络数据和等待用户输入有很多时间处于等待状态,多线程利用这个特点将任务分成多个并发任务后,就可以解决这个问题。Java中的线程类 1.扩展java.lang.Thread类,用它覆盖Thread类的run方法。 2.生成实现java.lang.Runnable接口的类并将其它的实例与java.lang.Thread实例相关联。 Thread类是负责向其它类提供线程支持的最主要的类,要使用一个类具有线程功能,在Java中只要简单地从Thread类派生一个子类就可以了扩展Thread类,如printThread.java。 Thread类最重要的方法是run方法。run方法是新线程执行的方法,因此生成java.lang.Thread的子类时,必须有相应的run方法。 //PrintThread.java public class PrintThread extends Thread//继承Tread类 private int count=0 //定义一个count变量用于统计打印的次数并共享变量 public static void mainString args//main方法开始 PrintThread p=new PrintThread//创建一个线程实例 p.start//执行线程 for{;;}//主线程main方法执行一个循环,for执行一个死循环count++ System.out.printcount+″:Main\n″//主线程中打印count +“main”变量的值,并换行 public void run//线程类必须有的run()方法for{;;}count++ System.out.printcount+″:Thread\n″ 上面这段程序便是继承java.lang.Tread并覆盖run的方法。用Java 虚拟机启动程序时,这个程序会先生成一个线程并调用程序主类的main方法。这个程序中的main方法生成新线程,连接打印“Thread”。在启动线程之后,主线程继续打印“Main”。 编译并执行这个程序,然后立即按“Ctrl+C”键中断程序,你会看到上面所述的两个线程不断打印出:XXX:main…..XXX:Thread…. XXX代表的是数字,也就是上面count的值。在笔者的机器上,不同时刻这两个线程打印的次数不一样,先打印20个main(也就是先执行20次主线程)再打印出50次Thread,然后再打印main…… 提示:为了便于查看该程序的执行结果,你可以将执行结果导入一个文本文件,然后打开这个文件查看各线程执行的情况。如运行: javac PrintThread.java Java PrintThread1.txt 第一个命令javac PrintThread.java是编译java程序,第二个是执行该程序并将结果导入1.txt文件。当然你可以直接执行命令:java
‘玖’ 如何评价 c++多线程编程实战 知乎
多线程编程的难点不在于锁,正常人看一下操作系统再写几个线程demo就可以基本理解了。对于C++而言,甚至连编写线程安全的类也不是难事。只需要用同步原语来保持对共享资源的访问即可。我个人觉得最需要的就是实战,写Demo谁都会写。同步原语就那么几个,信号量,互斥量,条件变量等。但是怎么用呢?当你从点击星际争霸到和玩家匹配进行游戏,这当中程序是怎么运行的?事件驱动是怎么驱动的?就目前来说,我遇到的困难不是线程的死锁,而是对并发模型的理解。Actor,Reactor模式等。这些东西不实战,个人空想理解起来会吃力。
‘拾’ 多线程编程怎么回事啊
每个正在系统上运行的程序都是一个进程。每个进程包含一到多个线程。进程也可能是整个程序或者是部分程序的动态执行。线程是一组指令的集合,或者是程序的特殊段,它可以在程序里独立执行。也可以把它理解为代码运行的上下文。所以线程基本上是轻量级的进程,它负责在单个程序里执行多任务。通常由操作系统负责多个线程的调度和执行。
什么是多线程?
多线程是为了使得多个线程并行的工作以完成多项任务,以提高系统的效率。线程是在同一时间需要完成多项任务的时候被实现的。
使用线程的好处有以下几点:
·使用线程可以把占据长时间的程序中的任务放到后台去处理
·用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度
·程序的运行速度可能加快
·在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。在这种情况下我们可以释放一些珍贵的资源如内存占用等等。
还有其他很多使用多线程的好处,这里就不一一说明了。
一些线程模型的背景
我们可以重点讨论一下在Win32环境中常用的一些模型。
·单线程模型
在这种线程模型中,一个进程中只能有一个线程,剩下的进程必须等待当前的线程执行完。这种模型的缺点在于系统完成一个很小的任务都必须占用很长的时间。
·块线程模型(单线程多块模型STA)
这种模型里,一个程序里可能会包含多个执行的线程。在这里,每个线程被分为进程里一个单独的块。每个进程可以含有多个块,可以共享多个块中的数据。程序规定了每个块中线程的执行时间。所有的请求通过Windows消息队列进行串行化,这样保证了每个时刻只能访问一个块,因而只有一个单独的进程可以在某一个时刻得到执行。这种模型比单线程模型的好处在于,可以响应同一时刻的多个用户请求的任务而不只是单个用户请求。但它的性能还不是很好,因为它使用了串行化的线程模型,任务是一个接一个得到执行的。
·多线程块模型(自由线程块模型)
多线程块模型(MTA)在每个进程里只有一个块而不是多个块。这单个块控制着多个线程而不是单个线程。这里不需要消息队列,因为所有的线程都是相同的块的一个部分,并且可以共享。这样的程序比单线程模型和STA的执行速度都要块,因为降低了系统的负载,因而可以优化来减少系统idle的时间。这些应用程序一般比较复杂,因为程序员必须提供线程同步以保证线程不会并发的请求相同的资源,因而导致竞争情况的发生。这里有必要提供一个锁机制。但是这样也许会导致系统死锁的发生。