多线程
一:什么是多线程
多线程(英语:multithreading),是指从软件或者硬件上实现多个线程并发执行的技术。
硬件上实现
多核处理器带有一个以上的物理内核(真正独立的处理单元),多个物理内核使得多条指令内同时执行。
(什么是线程:
在一个程序中,独立运行的程序片段叫作“线程”(Thread)。同一类线程共享代码和数据空间,每个线程有独立的运行栈和 程序计数器(PC),线程切换开销小。(线程是cpu调度的最小单位))
但是值得注意的是:2015年为止,很多计算机都是单核的,所以cpu(负责电脑调度)在一个时间段只能有一个线程在运行。所以现代多 任务操作系统对cpu都是分时间片使用的,cpu快速切换线程,让我们误以为真的是同时有多个线程在运行,但其实线程还是串行的。
二:在java中怎么实现多线程
在java中要想实现多线程,有两种手段,一种是继续Thread类,另外一种是实现Runable接口.
(但确切地说应该还有一种,是实现Callable接口,并与Future、线程池结合使用)。
1:扩展java.lang.Thread
继承Thread类的方法是比较常用的一种,如果说只是想起一条线程。没有什么其它特殊的要求,那么可以使用Thread.来看下面一下的例子
package text; /** * @fution 多线程练习 * @author Moots */ import java.util.*; import java.lang.Thread; import 多线程实例.threadTest; class threadTest extends Thread { private String name; public threadTest(String name) { this.name = name; } public void run(){ for(int i=0;i<5;i++) { System.out.println(name+"运行"+i); try { Thread.sleep((int) Math.random() * 10); } catch (InterruptedException e) { e.printStackTrace(); } } } } public class text { public static void main(String[] args) { threadTest test1=new threadTest("A"); threadTest test2=new threadTest("B"); test1.start(); test2.start(); } }
输出:
A运行0
B运行0
B运行1
A运行1
B运行2
A运行2
A运行3
B运行3
A运行4
B运行4
B运行0
B运行1
A运行1
B运行2
A运行2
A运行3
B运行3
A运行4
B运行4
再运行一次
输出:
A运行0
B运行0
A运行1
B运行1
A运行2
A运行3
B运行2
B运行3
B运行4
A运行4
B运行0
A运行1
B运行1
A运行2
A运行3
B运行2
B运行3
B运行4
A运行4
说明:
程序启动运行main时候,java虚拟机启动一个进程,主线程main在main()调用时候被创建。随着调用两个对象的start方法,另外两个线程也启动了,这样,整个应用就在多线程下运行。
注意:start()方法的调用后并不是立即执行多线程代码,而是使得该线程变为可运行态(Runnable),什么时候运行是由操作系统决定的。
可以从输出结果中看出,输出都是随机输出的,所以多线程程序是乱序执行的。
2:实现java.lang.Runnable
只有从新写run方法就可以
package text;
/**
* @fution 多线程练习
* @author Moots
*/
import java.util.*;
import java.lang.Runnable;
class threadTest2 implements Runnable{
private String name;
public threadTest2(String name) {
this.name = name;
}
@Override
public void run(){
for(int i=0;i<5;i++)
{
System.out.println(name+"运行"+i);
try {
Thread.sleep((int) Math.random() * 10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class text {
public static void main(String[] args)
{
new Thread(new threadTest2("C")).start();
new Thread(new threadTest2("D")).start();
}
}
注意:textThread2类通过实现Runnable接口,使得该类有了多线程类的特征。run()方法是多线程程序的一个约定。所有的多线程代码都在run方法里面。Thread类实际上也是实现了Runnable接口的类。
实际上所有的多线程代码都是通过运行Thread的start()方法来运行的。因此,不管是扩展Thread类还是实现Runnable接口来实现多线程,最终还是通过Thread的对象的API来控制线程的,熟悉Thread类的API是进行多线程编程的基础。