程序猿学社的GitHub,欢迎Star
https://github.com/ITfqyd/cxyxs
本文已记录到github,形成对应专题
上章,我们已经了解线程的一些基本概念。本文我们来看看多线程的应用场景,为什么要用多线程,以及实现一个多线程有几种方式。
多线程是指通过软件优化和硬件(CPU)的方式,同时并发运行多个线程(任务)。更好的运行系统的资源。
例如,社长,很久以前,接到boss的提的一个业务,需要开发一个充电桩管理物联网管理平台,实现通过网站,查看各个充电桩的情况。如果就社长一个人开发,感觉1年搞定都有点难,毕竟社长专注于后端开发,这时社长就跟boss提出,需要增加人马,招一个前端,一个后端。社长就负责跟硬件对接,每个人负责一块,各种同步开发。最后,通过社长三人的努力,半年就交差了。这就是多线程的好处。多个人,信息也是共享(一个进程内的多个线程,资源是共享在同一个内存中)
为了模拟真实的场景,每个线程中,都增加了延迟运行的代码。
Thread.sleep(1000);
这句代码表示休眠1秒钟,以毫秒为单位。
package com.cxyxs.two;
import java.util.Date;
/**
* Description:第一种:通过继承的方式,实现多线程
* 转发请注明来源 程序猿学社 - https://ithub.blog.csdn.net/
* Author: 程序猿学社
* Date: 2020/2/17 21:37
* Modified By:
*/
public class MyThreadExtend extends Thread {
@Override
public void run() {
for (int i = 0; i < 5; i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("程序猿学社:社长在开发中,通过继承的方式实现:" + new Date());
}
}
}
调用代码
//第一种方式
MyThreadExtend threadExtend = new MyThreadExtend();
threadExtend.start();
package com.cxyxs.two;
import java.util.Date;
/**
* Description:转发请注明来源 程序猿学社 - https://ithub.blog.csdn.net/
* Author: 程序猿学社
* Date: 2020/2/17 21:43
* Modified By:
*/
public class MyThreadRunnable implements Runnable{
@Override
public void run() {
for (int i = 0; i < 5; i++) {
try {
Thread.sleep(1200);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("小二在开发中,通过实现Runnable接口方式实现:" + new Date());
}
}
}
调用代码
//第二种方式
MyThreadRunnable runnable = new MyThreadRunnable();
Thread thread = new Thread(runnable);
thread.start();
//匿名内部类-第一种
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("通过匿名内部类的方式第一种实现!");
}
}).start();
//匿名内部类-第二种
new Thread(){
@Override
public void run() {
System.out.println("通过匿名内部类的方式第二种实现!");
}
}.start();
public class MyThreadCallable implements Callable<Integer> {
@Override
public Integer call() throws Exception {
int sum=0;
for (int i = 0; i < 5; i++) {
try {
Thread.sleep(1500);
} catch (InterruptedException e) {
e.printStackTrace();
}
sum+=i;
System.out.println("小王通过实现Callable接口的方式实现:" + new Date());
}
return sum;
}
}
调用代码
//第四种 通过Callable实现多线程
MyThreadCallable callable = new MyThreadCallable();
FutureTask<Integer> result = new FutureTask<Integer>(callable);
new Thread(result).start();
try {
Integer sum = result.get();
System.out.println("计算结果:"+sum);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
public class ThreadCount {
public static void main(String[] args) {
ThreadGroup group =
Thread.currentThread().getThreadGroup();
int count = group.activeCount();
group.list();
}
}
idea打印
eclipse打印
启动了2个线程,一个主线程main,是程序的入口。
还有一个[Monitor Ctrl-Break,这是IDEA特有的监控线程。正确的打印应该是gc线程。通过上面两张图,就可以得出这个结论。
public class Test {
public static void main(String[] args) {
//第一种方式
MyThreadExtend threadExtend = new MyThreadExtend();
threadExtend.start();
//第二种方式
MyThreadRunnable runnable = new MyThreadRunnable();
Thread thread = new Thread(runnable);
thread.start();
//第三种方式
//匿名内部类-第一种
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("通过匿名内部类的方式第一种实现!");
}
}).start();
//匿名内部类-第二种
new Thread() {
@Override
public void run() {
System.out.println("通过匿名内部类的方式第二种实现!");
}
}.start();
//第四种 通过Callable实现多线程
MyThreadCallable callable = new MyThreadCallable();
FutureTask<Integer> result = new FutureTask<Integer>(callable);
new Thread(result).start();
try {
Integer sum = result.get();
System.out.println("计算结果:"+sum);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}