目录
一。并发和并行
个人理解:多线程就是一个程序可以干很多事
单线程:同一时间,只允许执行一个线程
多线程:同一时间,可以执行多个线程
例如:一个QQ可以进行多个聊天进程,一个迅雷下载可以进行多个下载的人物。简单来说多线程就是一个程序可以在同一时间执行多个任务。
并发与并行
并发:同一时间多个任务交替执行,造成貌似在同时处理多件事的效果。
例如:一个人既在开车又在打电话
例如:单核cpu处理多个进程。
并行:同一时间多个cpu处理多个进程。多核cpu实现并行。
例如:一个人打电话一个人开车
补充:可以通过任务管理器查看电脑进程,可以通过 任务管理器——性能——打开资源监控器——cpu 可以查看自己电脑cpu的状态
通过下列代码可以查看自己电脑cpu为几核
public class CpuNum {
public static void main(String[] args) {
Runtime runtime = Runtime.getRuntime();
int i = runtime.availableProcessors();
System.out.println(i);
}
}
二。有关于线程的基本原理
1.第一种创建线程的方式
一共有两种创建方式,实现接口的更具有广泛性(更好使)
继承Thread类,然后重写run()方法
public class Thread1 {
public static void main(String[] args) {
Mao mao = new Mao();
mao.start();
System.out.println("线程的名字是"+Thread.currentThread().getName());
}
}
class Mao extends Thread{
@Override
public void run() {
System.out.println("猫猫在喵喵叫。。。");
System.out.println("线程的名字是"+Thread.currentThread().getName());
}
}
问题:为什么调用使用的是start方法,而不是run,原因如下图,真正创建线程的是start方法当中的start0方法,而不是run方法。
运行结果:
线程的名字是main
猫猫在喵喵叫。。。
线程的名字是Thread-1
补充:我们通过下面两行代码获取了线程的名字,以证明确实是创建了线程的.其中main线程是主方法自带的线程。Thread-1是我们通过继承Thread创建的
System.out.println("线程的名字是"+Thread.currentThread().getName());
例题:
注意:JConsole我跳过了,没有学。sorry。
休眠方法:参数为毫秒数1000ms=1s 也就是间隔时间1执行一次
Thread.sleep(1000);
注意:该方法会报 InterruptedException异常所以要进行cry/catch或者异常抛出(方法写在run()方法中)
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
答案:
public class Thread1 {
public static void main(String[] args) {
Mao mao = new Mao();
mao.start();
}
}
class Mao extends Thread{
private int count = 0;
private boolean bool = true;
@Override
public void run() {
while (bool){
if (count==80){
bool =false;
return;
}
System.out.println("喵喵,我是小猫咪!"+(++count));
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
通过while循环,通过bool的值来控制循环,当退出循环hou,run()方法执行完毕,线程关闭。(稍后会讲解使用查看线程状态的方法)
2.多线程机制
修改一行代码,查看线程名
System.out.println("喵喵,我是小猫咪!"+(++count)+Thread.currentThread().getName());
得到:
喵喵,我是小猫咪!1线程名为Thread-0
喵喵,我是小猫咪!2线程名为Thread-0
喵喵,我是小猫咪!3线程名为Thread-0
下图为线程之间的关系,通过start()创建的子线程
对答案代码进行修改
public class Thread1 {
public static void main(String[] args) throws InterruptedException {
Mao mao = new Mao();
mao.start();
System.out.println("主线程执行"+Thread.currentThread().getName());
for (int i = 0;i<10;i++){
System.out.println("主线程 i="+i);
Thread.sleep(1000);
}
}
}
class Mao extends Thread{
private int count = 0;
private boolean bool = true;
@Override
public void run() {
while (bool){
if (count==80){
bool =false;
break;
}
System.out.println("喵喵,我是小猫咪!"+(++count)+"线程名为"+Thread.currentThread().getName());
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
执行会发现,主线程与子线程一起执行并且主线程是否结束执行不会影响到子线程的执行。
3.第二种创建线程的方式
使用实现Runnable接口的方法来实现多线程
说明:Java是单继承,为避免已经有继承的父类,而无法使用第一种方法,所以创建了Runnable接口。
使用:
public class Thread02 {
public static void main(String[] args) {
Dog dog = new Dog();
Thread thread = new Thread(dog);
thread.start();
}
}
class Dog implements Runnable{
int count = 0;
@Override
public void run() {
while (true){
try {
System.out.println("小狗创造。。");
Thread.sleep(1000);
} catch (Exception e) {