电脑中时会有很多单独运行的程序,每个程序有一个独立的进程,而进程之间是相互独立存在的。比如我们电脑中的QQ、微信,网易播放器、电脑管家等等.
什么是线程?
进程想要执行任务就需要依赖线程。换句话说,就是进程中的最小执行单位就是线程,并且一个进程中至少有一个线程。
什么是多线程?
提到多线程这里要说两个概念,就是串行和并行,搞清楚这个,我们才能更好地理解多线程。
所谓串行,其实是相对于单条线程来执行多个任务来说的,我们就拿下载文件来举个例子:当我们下载多个文件时,在串行中它是按照一定的顺序去进行下载的,也就是说,必须等下载完A之后才能开始下载B,它们在时间上是不可能发生重叠的。
并行:下载多个文件,开启多条线程,多个文件同时进行下载,这里是严格意义上的,在同一时刻发生的,并行在时间上是重叠的。
那么什么是多线程呐?
举个例子,我们打开腾讯管家,腾讯管家本身就是一个程序,也就是说它就是一个进程,它里面有很多的功能,我们可以看下图,能查杀病毒、清理垃圾、电脑加速等众多功能。
按照单线程来说,无论你想要清理垃圾、还是要病毒查杀,那么你必须先做完其中的一件事,才能做下一件事,这里面是有一个执行顺序的。
如果是多线程的话,我们其实在清理垃圾的时候,还可以进行查杀病毒、电脑加速等等其他的操作,这个是严格意义上的同一时刻发生的,没有执行上的先后顺序。
如何实现多线程:
第一种:实现Runnable接口
public class Printnum implements Runnable{
int num = 1;
@Override
public void run() {
while(true){
synchronized (this) {
notify(); //唤醒等待的线程,每次随机唤醒一个线程
if (num <= 10) {
System.out.println(Thread.currentThread().getName() + ":"+ num);
num++;
} else {
break;
}
try {
wait();//表示线程一直等待,等待唤醒,直到其它线程通知
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
测试类:
public class PrintText {
//线程通讯
//使用两个线程打印 1-10. 线程1, 线程2 交替打印
public static void main(String[] args) {
Printnum pn = new Printnum();
Thread r1 = new Thread(pn,"线程一");
Thread r2 = new Thread(pn,"线程二");
r1.start();
r2.start();
}
}
运行结果:
第二种:继承Thread类
public class SubThread extends Thread{
//子线程
@Override
public void run() {
//调用线程时调用方法
for(int i=0;i<=100;i++){
try {
Thread.sleep(100); //每次执行子线程前先休眠100毫秒在执行
} catch (InterruptedException e) {
e.printStackTrace();
}
//Thread.currentThread()为返回当前线程,即SubThread里的线程
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
}
测试类:
public class Text {
//主线程,main就是主线程
public static void main(String[] args) {
//调用子线程
SubThread subthread = new SubThread();
subthread.setName("子线程"); //设置线程名字
//设计子线程优先级,1~10,10最高;或者MAX_PRIORITY:取值为10;MIN_PRIORITY:取值为1;NORM_PRIORITY:取值为5
subthread.setPriority(Thread.NORM_PRIORITY);
subthread.start(); //启动线程,注意:不是subthread.run();否则调用方法,而不是启动线程,虽然子程序启动在前,但是是先执行主程序
Thread.currentThread().setName("主线程");
for(int i=0;i<=100;i++){
//Thread.currentThread()为返回当前线程,即main里的线程
System.out.println(Thread.currentThread().getName()+":"+i);
if(i==20){
try {
subthread.join(); //当主线程到了20时加入子线程,让子线程执行完后才执行主线程
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if(i==90){
subthread.stop(); //当主线程执行到90时,让子线程强行停止
}
}
}
}
运行结果:
图一
图二
后面会相继发布多线程的相关文章,敬请关注。