1. 如何使用线程
java平台从开始就被设计成为多线程环境。在你的主程序执行的时候,其它作业如碎片收集和事件处理则是在后台进行的。本质上,你可以认为这些作业是线程。它们正好是系统治理线程,但是无论如何,它们是线程。线程使你能够定义相互独立的作业,彼此之间互不干扰。系统将交换这些作业进或出CPU,这样(从外部看来)它们好象是同时运行的。 在你需要在你的程序中处理多个作业时,你也可以使用多个进程。这些进程可以是你自己创建的,你也可以操纵系统线程。 你进行这些多作业处理,要使用几个不同的类或接口: java.util.Timer类
javax.swing.Timer类Thread类Runnable接口 对于简单的作业,通常需要重复的,你可以使用java.util.Timer类告诉它“每半秒钟做一次”。注重:大多数系统例程是使用毫秒的。半秒钟是500毫秒。 你希望Timer实现的任务是在java.util.TimerTask实例中定义的,其中运行的方法包含要执行的任务。这些在Hi类中进行了演示,其中字符串“Hi”重复地被显示在屏幕上,直到你按Enter键。 import java.util.*;
public class Hi {
public static void main(String args[])
throws java.io.IOException {
TimerTask task = new TimerTask() {
public void run() {
System.out.PRintln("Hi");}};Timer timer = new Timer();
timer.schedule(task, 0, 500);
System.out.println("Press ENTER to stop");
System.in.read(new byte[10]);
timer.cancel();}} Java Runtime Environment工作的方式是只要有一个线程在运行,程序就不退出。这样,当取消被调用,没有其它线程在运行了,则程序退出。有一些系统线程在运行,如碎片收集程序。这些系统线程也被称为后台线程。后台线程的存在不影响运行环境被关闭,只有非后台线程保证运行环境不被关闭。 Javax.swing.Timer类与java.util.timer类的工作方式相似,但是有一些差别需要注重。第一,运行的作业被ActionListener接口的实现来定义。第二,作业的执行是在事件处理线程内部进行的,而不象java.util.Timer类是在它的外部。这是很重要的,因为它关系到Swing组件集是如何设计的。 假如你不熟悉Swing,它是一组可以被Java程序使用的图形组件。Swing被设计程被称为单线程的。这意味着对Swing类内部内容的访问必须在单个线程中完成。这个特定的线程是事件处理线程。这样,例如你想改变Label组件的文字,你不能仅仅调用Jlabel的setText方法。相反,你必须确认setText调用发生在事件处理线程中,而这正是javax.swing.Time类派的上用场的地方。 为了说明这第二种情况,下面的程序显示一个增加的计数器的值。美半秒钟计数器的数值增加,并且新的数值被显示。
2. 怎么理解多线程,为什么要用多线程
为了解决负载均衡问题,充分利用CPU资源.为了提高CPU的使用率,采用多线程zhidao的方式去同时完成几件事情而不互相干扰.为了处理大量的IO操作时或处理的情况需要花费大量的时间等等,比如:读写文件,视频图像的采集,处理,显示,保存等
多线程的好处:
1.使用线程可以把占据时间长的程序中的任务放到后台去处理
2.用户界面更加吸引人,这样比如用户点击了一个按钮去触发某件事件的处理,可以弹出一个进度条来显示处理的进度
3.程序的运行效率可能会提高
4.在一些等待的任务实现上如用户输入,文件读取和网络收发数据等,线程就比较有用了.
多线程的缺点:
1.如果有大量的线程,会影响性能,因为操作系统需要在它们之间切换.
2.更多的线程需要更多的内存空间
3.线程中止需要考虑对程序运行的影响.
4.通常块模型数据是在多个线程间共享的,需要防止线程死锁情况的发生
3. 如何学会多线程工作
转载这是一个很有意思的问题,我准备先介绍一下心理学上对这个问题的看法,然后从自己的思考和经验出发谈一谈应对之道。
的确,从认知心理学的观点来看,严格来讲人的「多线程工作」是不可能的。因为在任一个瞬间,人只能有一个「注意焦点」,这个注意焦点牵引了人的认知加工资源。
但有时你会误以为同时关注了两个东西,其实是发生了注意转移的结果,即焦点从一个对象转移到另一个对象上,实际上还是一个串行而非并行的过程。当然有一种例外是,有些很熟练的技能,可以「自动化」地、不加注意地进行,那么就可以和其他事情同时做。
比如你骑自行车,你的女朋友坐在后面笑,这时你的注意焦点保持在你女友身上,你和她聊天的同时,你的腿也在一刻不停地蹬,你不需要停下来是因为骑车不需要你的注意和认知资源。但如果此时突然前面蹿出一只喵星人,你可能立马就会把注意焦点给转移了。
当然题主烦恼的并非是这种「秒级」、「毫秒级」的「多线程」,而是指在一个「时期」内,会同时担负几种不同的工作,完成不同的任务,这就是另一种意义上的,不同任务之间需要切换的「多线程」。「任务切换(task switching)」也可以算认知心理学中的一个经典课题了。
心理学家早就发现,当你从任务A切换到任务B后,执行任务B的绩效要明显比非任务切换条件下执行B的绩效差,这个差异称为「切换代价(switching cost)」。切换代价的形成原因主要有两种,一是任务A留下的认知惯性,也就是我之前已经习惯了任务A的认知情境、反应方式,这个惯性会对完成任务B造成干扰,二是做B的时候需要对B进行认知重构,重新回忆起B的相关背景和信息,这个重构也需要时间,而且可能不完整。
可现实就是这样,虽然不论从心理学还是从我们的生活经验来看,这种需要任务切换的「多线程」的感觉很糟,效率很低,但我们往往没有选择:一个任务做到一半被打断,然后去做另一个任务,然后又被打断,又去做另一个……这里有个至关重要的事实是:如果你是在非常投入和忘我的思考时被打断,那么你的「损失」和懊恼就会非常大,相反,如果你只是在做抄写一篇文档这种不动脑子的活,那么即便是频繁的中断也不会对你造成太大的影响。所以,如果你能选择好合适的中断点,中断就并不可怕,切换的损失也可以降到最低,如果说多任务工作有什么技巧的话,那么这个技巧就是「对中断点进行控制和管理的技巧」。
这个技巧的前提是,我们需要对要完成的任务进行有效地剖析,区分出「容忍中断」的部分和「无法容忍中断」的部分,然后用可保证的相对完整的时间去施行那些「无法容忍中断」的部分。为此我提出了一般任务分解的「三明治模型」: 这是一个金枪鱼三明治,它有一个核心,就是金枪鱼肉泥,完成这个部分的努力我称为「核心思考区间」。
事实上大多数任务都有一个至关重要、通常也是最棘手的部分,这个部分需要我们集中精力、非常专注地进行思考,然后将其破解,一旦这个部分被我们「吃下」,那么这个任务就已经完成了大半,余下的就是一些支持性的、补完性的工作(即「支持性思考区间)和一些「体力劳动」(即「操作性动作区间」)了。 我自己工作中有一个习惯,就是拿到一个任务后,势必要先去找那个任务的核心思考区间,找到那块硬骨头,去啃下来,而不是先去做那些周边的打扫性的工作。
举个简单的例子,如果你现在接到一个做PPT的任务,你第一步准备做什么?是先挑一个漂亮的主题模板吗?不是。是马上去百度谷歌查资料吗?也不是。
正确的答案是:设计PPT的架构。即你要分析你的受众,他们的知识水平、理解水平以及兴趣点、关注点,在此基础上设计你的内容以及展现内容的顺序,先讲什么,占比多少,再讲什么,占比什么,以及讲的时候采取什么风格、策略,然后,PPT的架构就出来了。
这个实施过程就是该任务的「核心思考区间」,你不需要任何辅助,你只需思考,非常专注的思考,你要的工具,仅仅是一张纸和一只笔(你需要把你的灵感快速地记下来)。等你完成了这个过程,你可以选择继续填充具体的内容(「支持性思考区间」),也可以break一下,也可以去做别的工作,都无所谓。
之后,等你在为这件PPT选择模板、寻找配图或者调整字体的时候(「操作性动作区间」),你并不大会介意被打断,因为你知道,这个任务在某种意义上,你已经完成了。 不瞒你说,为了写这个答案,我用了半个小时的时间、一张A4纸和一只笔,用我纯粹的、专注的思考,来设计它的「架构」。
设计完成后,我吃了一顿晚饭,看了一集美剧,这个写作的中断并没有让我担心,因为我知道,即便我还没有在电脑上敲入一个字,这个答案,其实已经写完了。 这就是多线程工作的秘诀。
很多时候,你只是需要一个专注不受干扰的、能纯粹跳脱出来思考的、能达至「心流」状态的、能把最关键的「硬核」搞定的——半小时。 这个方法背后暗含着这样一个逻辑:当我们不得不对一个任务进行分段处理时,我们并不应机械地按照时间段来切分(「今天上午9点至10点做A,明天下午1点至3点继续做A」),而是应该按照这。
4. C语言怎样实现多线程
首先你要有控制蛇移动方向的全局变量(定义在main以外因为线程函数也要调用它,每次键盘输入都会修改它的值), 比如 char direction 'a' ==左 'w' == 右 'd'==上 's' == 下,然后你在移动时应该是在while里面操作的吧,你每移动一步前都读一下direction这个变量的数值然后再控制移动方向(注意s这个键可以忽略因为不会倒着走) 然后你可以用pthread.h这个库 例子是 pthread t;// 定义一个线程 pthread_create(&t, null, listen_keyboard_input, null);//建立线程执行listen_keyboard_input这个函数 这个线程执行的函数 void listen_keyboard_input(){ while(应该通过某个信号来退出这个循环,从而表示游戏结束){ direction =getchar(); } } 但是这里存在同步问题, 比如当这个线程的getchar()在给direction辅助的同时,你控制贪吃蛇移动的线程正在调用 direction的值来判断下一个移动方向,这就会出问题,所以要加一个锁,叫 mutex lock;这个也定义成全局变量可以使各线程共享。
pthread_mutex_t mutex; //定义一个锁 pthread_mutex_init(&mutex, null, null);//初始化 然后把函数修改成 void listen_keyboard_input(){ while(应该通过某个信号来退出这个循环,从而表示游戏结束){ pthread_mutex_lock(&mutex); direction =getchar(); pthread_mutex_unlock(&mutex); } } 另外一个控制贪吃蛇移动的时候也要加锁 while(。..){ char c; pthread_mutex_lock(&mutex); c = direction; pthread_mutex_unlock(&mutex); switch(c){ 。
. } 。
.. } 这样就好了 注意你的控制贪吃蛇移动的部分也必须要放在另外一个pthread 里面执行,如果放在主线程, 主线程会一直等listen_keyboard_input而什么事都不会做 你把这两个线程用 pthread_create 创建完成后 用 t1.join(); t2.join(); 就可以使这两个线程并发执行了 如果你用的是linux 来编译的,你再输入gcc 指令后加上 -lpthread 就可以了 还有什么不懂的你可以多找找 pthread 类的例子。
5. 简单实例说明多线程是怎么实现的
用mutex 或者event来做
你去MSDN上查一下
MFC一共有4种线程互斥的机制呢
在主线程中 建立互斥对象
在输出操作后释放该对象
在每个子线程中的输出之前 等待互斥对象
输出后释放互斥对象
具体的函数 很简单 MSDN都有
如CreateMutex()创建
Realese()释放
WaitForSingle。。。()记不太清除 等待的
自己查下吧 别人写的代码永远不是你的
你自己试着用的过程中会学到很多东西的
6. 怎么练多线程操作
第一个 心态 !这个是多线最重要的地方 你首先是心态要好 往往新手容易慌乱 如果慌乱 你随便怎么 都多线不起来 双线都是乱的 第二 不要去学耍帅吧 先把正常的操作练熟 比如下载微操练习图之类的 在你练习的同时 心态 熟练程度都在上升 只所以职业玩家多线得起来 很大一个原因就是他们在MF 怪物 或者对付敌人的时候 他们要非常的了解怪物的情况 敌人的情况 这些都是对这款游戏的熟练程度 上去了 才能实现的 所以在你了解得足够多的时候 再来考虑练双线 多线吧 第三 你具备了比较熟练的程度 也就是有个稳定的心态 不慌张 双线骚扰+MF 怪物的时候 能够冷静的估计双线的2个地方的情况 心理有数了 一切就随之而来了 比如你这边跟敌人纠缠 那边的兵正在MF 怪物 你要对怪物对你兵的攻击情况 以及你兵力能力的正确估计有数 对整个战局的发生的时间有数 就是职业选手说的 “节奏感” 你不总可能不了解这些 虽然手速到了 你每次拉兵都拉慢一点 双线MF 战局兵死一大半吧>_。