一、简述
线程是进程中的一部分,也是进程的的实际运作单位,它也是操作系统中的最小运算调度单位。进程中的一个单一顺序的控制流就是一条线程,多个线程可以在一个进程中并发。可以使用多线程技术来提高运行效率。
多线程是为了同步完成多项任务,不是为了提高运行效率,而是为了提高资源使用效率来提高系统的效率。线程是在同一时间需要完成多项任务的时候实现的 。
二、原理
简单地说就是把一个处理器划分为若干个短的时间片,每个时间片依次轮流地执行处理各个应用程序,由于一个时间片很短,相对于一个应用程序来说,就好像是处理器在为自己单独服务一样,从而达到多个应用程序在同时进行的效果。
多线程就是把操作系统中的这种并发执行机制原理运用在一个程序中,把一个程序划分为若干个子任务,多个子任务并发执行,每一个任务就是一个线程。这就是多线程程序 。
多线程技术不但可以提高交互式,而且能够更加高效、便捷地进行控制。在对多线程应用的时候,可以使程序响应速度得到提高,从而实现速度化、高效化的特点。另外,多线程技术存在的缺点也比较明显,需要等待比较长的时间之外,还会在一定程度上使程序运行速度降低,使工作效率受到一定的影响,从而对资源造成了浪费。
三、多线程的优缺点
3.1.优点:
(1)使用线程可以把占据时间长的程序中的任务放到后台去处理。
(2)用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度。
(3)程序的运行速度可能加快。
(4)在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。在这种情况下可以释放一些珍贵的资源如内存占用等。
(5)多线程技术在IOS软件开发中也有举足轻重的作用。
3.2.缺点:
(1)如果有大量的线程,会影响性能,因为操作系统需要在它们之间切换。
(2)更多的线程需要更多的内存空间。
(3)线程可能会给程序带来更多“bug”,因此要小心使用。
(4)线程的中止需要考虑其对程序运行的影响。
(5)通常块模型数据是在多个线程间共享的,需要防止线程死锁情况的发生。
四、多线程的使用
有效利用多线程的关键是理解程序是并发执行而不是串行执行的。例如:程序中有两个子系统需要并发执行,这时候就需要利用多线程编程。
通过对多线程的使用,可以编写出非常高效的程序。不过请注意,如果你创建太多的线程,程序执行的效率实际上是降低了,而不是提升了。
请记住,上下文的切换开销也很重要,如果你创建了太多的线程,CPU 花费在上下文的切换的时间将多于执行程序的时间
五、线程实现
5.1.实现Runnable 接口
创建一个线程,最简单的方法是创建一个实现 Runnable 接口的类,实现run()方法,编写线程体
创建线程对象,调用start()方法启动线程(启动后不一定立即执行,抢到CPU资源才能执行)
class Demo implements Runnable {
private Thread a;
private String Name;
Demo( String name) {
threadName = name;
System.out.println("Creating " + Name );
}
public void run() {
System.out.println("Running " + Name );
try {
for(int i = 4; i > 0; i--) {
System.out.println("Thread: " + Name + ", " + i);
// 让线程睡眠一会
Thread.sleep(50);
}
}catch (InterruptedException e) {
System.out.println("Thread " + Name + " interrupted.");
}
System.out.println("Thread " + Name + " exiting.");
}
public void start () {
System.out.println("Starting " + Name );
if (a == null) {
a = new Thread (this, Name);
a.start ();
}
}
}
public class TestThread {
public static void main(String args[]) {
Demo R1 = new Demo( "Thread-1");
R1.start();
Demo R2 = new Demo( "Thread-2");
R2.start();
}
}
5.2.继承Thread
1.自定义线程类继承Thread类
2.重写run()方法,编写线程执行体
3.创建线程对象,调用start()方法启动线程
public class TestThread extends Thread{
@Override
public void run() {
//run方法线程体
for (int i = 0; i < 20; i++) {
System.out.println(i+"上课");
}
}
public static void main(String[] args) {
//main主线程
//创建一个自己的线程对象
MyThread myThread = new MyThread();
//开启线程
myThread.start();
//另一件事
for (int i = 0; i < 1000; i++) {
System.out.println(i+"敲代码");
}
}
}
六、 多线程的主要作用
(1)在单核CPU中,将CPU分为很小的时间片,在每一时刻只能有一个线程在执行,是一种微观上轮流占用CPU的机制。由于CPU轮询的速度非常快,所以看起来像是“同时”在执行一样。多线程会存在线程上下文切换,会导致程序执行速度变慢;
(2)多线程不会提高程序的执行速度,反而会降低速度。但是对于用户来说,可以减少用户的等待响应时间,提高了资源的利用效率。
(3)多线程并发利用了CPU轮询时间片的特点,在一个线程进入阻塞状态时,可以快速切换到其余线程执行其余操作,这有利于提高资源的利用率,限度的利用系统提供的处理能力,有效减少了用户的等待响应时间。