一 概念
- 进程:当前正在运行的应用程序,应用程序在内存中的执行区域
线程:进程的一个执行控制单元,执行路径
一键加速,释放相关进程占用的内存(可以勾选要关闭的进程)
2. 进程与线程的关系
一个进程可以有多个线程
通过线程来运行程序
举个多线程例子 :①比如软件公司(进程)接了一个项目,但是实际干活的是公司里面的程序员(线程)。 ②杀毒软件,可以边杀毒,边体检,边清理垃圾。③ 下载软件,可以同时下载多部电影
3. 单线程与多线程
单线程:安全性高,效率低
多线程:安全性低,效率高
二 案例
1. JVM允许多线程
多线程效率高的原因:CPU执行程序是随机的,会在多个线程之间高速切换,若一个进程有多个线程,则会增加抢到CPU执行权的概率
2.CPU为何要随机执行程序
使用户感觉多个进程在同时执行,线程之间高速切换,实际上CPU只能执行一个线程。
3.编写线程类的方法
1.继承Thread类
2.创建Thread类,参数为 实现Runnable接口的对象
因为java单继承,继承了Thread便不能继承其他类,所以推荐第2种方式
4. 编写代码:
…..第一种方式…
编写线程类
package com.blueSky.threadDemo;
public class MyThread extends Thread{
@Override //重写run()方法
public void run() {
for(int i=0;i<50;i++){
System.out.println(this.getName()+" "+ i); //输出当前线程对象的名字 和 变量i的值
}
}
}
2.编写测试类 main法中创建线程对象进行测试
package com.blueSky.threadDemo;
public class ThreadTest {
public static void main(String[] args) {
MyThread myThread01 = new MyThread(); //创建第一个线程对象
myThread01.setName("线程A"); //设置线程的名字
myThread01.start(); //启动该线程
MyThread myThread02 = new MyThread(); //创建第二个线程对象
myThread02.setName("线程B"); //设置线程的名字
myThread02.start(); //启动线程
}
}
3.运行结果
若多个线程去修改一个变量,明显会提高运行效率,但是要注意共享数据
变量的值也可以从数据库获得。
main方法是单线程的。
…..第二种方式…
1.编写MyThread2类,实现Runnable接口,重写run方法
package com.blueSky.threadDemo2;
/*
* Thread.currentThread(); //静态方法 返回当前进程对象的引用
*
* */
public class MyThread2 implements Runnable{
private int count = 100 ;
@Override
public void run() {
Thread thread = Thread.currentThread(); //返回当前进程对象的引用
for(int i=0;i<=99;i++){
if(count==0){
break;
}
System.out.println( thread.getName() +" " + (--count));
}
}
}
2.编写测试类,创建Thread对象,构造器参数为myThread2对象
package com.blueSky.threadDemo2;
public class Thread2Test {
public static void main(String[] args) {
//创建Thread类,构造函数 参数为实现Runnable接口的对象
MyThread2 myThread01 = new MyThread2(); //创建MyThread对象
Thread thread1 = new Thread(myThread01); //创建Thread对象,参数为Runnable接口类型
thread1.setName("线程1");
thread1.start();
Thread thread2 = new Thread(myThread01); //创建Thread对象 ,构造器参数为myThread01
thread2.setName("线程2");
thread2.start();
}
}
3.结果显示