多线程 什么叫多线程任务
老铁们,大家好,相信还有很多朋友对于多线程和什么叫多线程任务的相关问题不太懂,没关系,今天就由我来为大家分享分享多线程以及什么叫多线程任务的问题,文章篇幅可能偏长,希望可以帮助到大家,下面一起来看看吧!
多线程是什么意思
线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针、程序计数器等),但代码区是共享的,
即不同的线程可以执行同样的函数。
什么是多线程?
多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务,
也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。
多线程的好处:
可以提高CPU的利用率。在多线程程序中,一个线程必须等待的时候,CPU可以运行其它的线程而不是等待,
这样就大大提高了程序的效率。
多线程与单线程的区别
生活举例
你早上上班,正要打卡的时候,手机响了。你如果先接了电话,等接完了,在打卡,就是单线程。
如果你一手接电话,一手打卡。就是多线程。
2件事的结果是一样的。你接了电话且打了卡。
多线程是什么呀
Windows是一个多任务的系统,如果你使用的是windows 2000及其以上版本,你可以通过任务管理器查看当前系统运行的程序和进程。什么是进程呢?当一个程序开始运行时,它就是一个进程,进程所指包括运行中的程序和程序所使用到的内存和系统资源。而一个进程又是由多个线程所组成的,线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针、程序计数器等),但代码区是共享的,即不同的线程可以执行同样的函数。多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。浏览器就是一个很好的多线程的例子,在浏览器中你可以在下载JAVA小应用程序或图象的同时滚动页面,在访问新页面时,播放动画和声音,打印文件等。
多线程的好处在于可以提高CPU的利用率——任何一个程序员都不希望自己的程序很多时候没事可干,在多线程程序中,一个线程必须等待的时候,CPU可以运行其它的线程而不是等待,这样就大大提高了程序的效率。
然而我们也必须认识到线程本身可能影响系统性能的不利方面,以正确使用线程:
线程也是程序,所以线程需要占用内存,线程越多占用内存也越多
多线程需要协调和管理,所以需要CPU时间跟踪线程
线程之间对共享资源的访问会相互影响,必须解决竞用共享资源的问题
线程太多会导致控制太复杂,最终可能造成很多Bug
基于以上认识,我们可以一个比喻来加深理解。假设有一个公司,公司里有很多各司其职的职员,那么我们可以认为这个正常运作的公司就是一个进程,而公司里的职员就是线程。一个公司至少得有一个职员吧,同理,一个进程至少包含一个线程。在公司里,你可以一个职员干所有的事,但是效率很显然是高不起来的,一个人的公司也不可能做大;一个程序中也可以只用一个线程去做事,事实上,一些过时的语言如fortune,basic都是如此,但是象一个人的公司一样,效率很低,如果做大程序,效率更低——事实上现在几乎没有单线程的商业软件。公司的职员越多,老板就得发越多的薪水给他们,还得耗费大量精力去管理他们,协调他们之间的矛盾和利益;程序也是如此,线程越多耗费的资源也越多,需要CPU时间去跟踪线程,还得解决诸如死锁,同步等问题。总之,如果你不想你的公司被称为“皮包公司”,你就得多几个员工;如果你不想让你的程序显得稚气,就在你的程序里引入多线程吧!
本文将对C#编程中的多线程机制进行探讨,通过一些实例解决对线程的控制,多线程间通讯等问题。为了省去创建GUI那些繁琐的步骤,更清晰地逼近线程的本质,下面所有的程序都是控制台程序,程序最后的Console.ReadLine()是为了使程序中途停下来,以便看清楚执行过程中的输出。
多线程的三种常见实现方式
多线程有三种常见的实现方式:
1.继承Thread类,重写run方法。
2.实现Runnable接口,重写run方法。
3.通过实现Callable接口和使用FutureTask包装器来实现线程
/**
*通过自己的类直接继承(extend) Thread,并复重写run()方法,就可以通过Thread类的start()方法启动线程,并执行自己定义的run()方法。Thread类的start()方法是启动线程的唯一方法。
*@author Lucky
*/
public class myThread_1 extends Thread{
public void run(){
System.out.println("方法1:继承Thread类,重写run方法");
}
public static void main(String args[]){
myThread_1 m1=new myThread_1();
myThread_1 m2=new myThread_1();
m1.start();
m2.start();
}
}
/**
*通过实现Runnable接口,重写run方法,将接口的实现类的实例作为参数传入带参的Thread构造函数中,然后就可以通过调用Thread类的start()方法启动线程。
*@author Lucky
**/
class myt2 implements Runnable{
public void run(){
System.out.println("方法2:通过实现Runnable接口,重写run方法");
}
}
public class myThread_2{
public static void main(String args[]){
//为了启动MyThread_2,
//创建一个Runnable子类的对象,然后把这个对象当作参数传入Thread实例中,
//这样就可以调用start()方法启动线程了。
//start()是Thread类中的方法。
myt2 m=new myt2();
Thread t1= new Thread(m);
t1.start();
}
}
/**通过Callable和FutureTask创建线程。创建Callable接口的实现类,并实现Call方法;
*由Callable<Object>创建一个FutureTask<Object>对象;
* FutureTask<Object>是一个包装器,它通过接受Callable<Object>来创建;
*由FutureTask<Object>创建一个Thread对象;
*最后通过调用Thread类的start()方法启动线程。
*@author Lucky
*/
import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;
public class myThread_3{
public static void main(String args[]){
Callable<Object> c=new myt3<Object>();
FutureTask<Object> f=new FutureTask<Object>(c);
Thread t=new Thread(f);
t.start();
}
}
//创建Callable接口的实现类,并重写call()方法
@SuppressWarnings("hiding")
class myt3<Object> implements Callable<Object>{
//重写call()方法
public Object call() throws Exception{
System.out.println("方法3:通过实现Callable接口和使用FutureTask包装器来实现线程");
return null;
}
}
好了,本文到此结束,如果可以帮助到大家,还望关注本站哦!