本文主要介绍线程的基本概念,同时在java中实现多线程操作。
解决问题
均用于回顾时的自我检查。
- 基础概念
1.什么是程序/进程/线程?
2.进程与线程的关系?
3.线程的生命周期,存在与执行的区别?
4.程序/进程/线程的储存位置?
5.Java中实现线程的两种方法? - 思考
1.多个线程同时处理一个对象会出现什么结果?为什么?
基础概念
1.程序
- 平时我们使用的微信,浏览器等都是程序,
- 由数据,算法,代码,资源文件等组成。
- 储存于磁盘。
2.进程
- 程序运行之后就是进程,数目有限。
- 储存于内存。
(打开任务管理器,你就会看到什么是进程了:))
3.线程
- 进程独立运行的基本组成单位,每个线程负责独立执行一段代码,执行代码后会销毁线程。
- 从线程创建到执行结束后销毁,我们称之为线程的生命周期。
- 生命周期具体如下:创建,启动,执行,(休眠,等待,暂停),停止。
- 储存在CPU和高速缓存。(在cpu计算,在高速缓冲储存计算需要数据,在内存存储数据)
注意:同时执行的线程数十分有限,大部分线程创建后会处于等待状态。
相对于线程的执行数,线程的存在数是巨大的。
所以我们使用多个线程提高硬件利用率,提高处理效率。
用Java实现线程
1.Runnable 接口(implements)
- 需要重写方法:run(){执行代码}
2.Thread类(extends)
- 需要重写方法:run(){代码};
- 可调用方法:start();sleep();
注意:
- 1.使用的选择:在一个类可以实现多个接口,而只能继承一个类,所以如果已经基础了类,那就只能去实现借口(runnable)。
- 2.线程只有通过调用start方法才会启动,其中start方法中调用了run方法,换句话说:实现runnable接口需要强制转换为thread,才能相应地执行任务。
我们这么做:Thread a=(Thread)b;是会报错的;
正确的操作:使用Thread的构造方法!
- ad a=new a();//一个实现runnable的类;
- Thread b=new Thread(a);//传入实现runnable类的构造方法;
- b.start();//启动线程,开始执行代码;
3.多线程
多线程就是针对每个线程有各自的执行代码,但是除了提高效率,使用多线程还有什么目的呢?
我们以绘图为例:
- 单线程画三条线,需要按顺序一条一条画;
- 多线程每个线程画一条线,三条线就可以同时画出来了;
而复杂运动动画的基本原理就是多线程在object重绘时执行绘制+人眼的视觉暂留效果,这样就会看到许多物体在同时不断运动了。
4.Jvm自动生成线程
- 每次运行程序至少会存在一个线程,Jvm会生成一个线程去执行main函数里的代码。
- 按照上文对线程的介绍,当main函数代码执行结束之后Jvm生成的线程会被销毁。
Java线程使用案例
案例一:
我们来回答一个问题:多个线程同时控制一个物体时会产生什么问题?
先修改一下前面的代码,让Thread让同一个变量自加同输出它当前的值。
我们先定义一个类,用于thread构造方法时传入同一个数。
package ThreadAnimation;
public class demo {
int id=1;
public demo() {
super();
}
public void print()
{
id++;
System.out.println(Thread.currentThread()+" ->"+id);
}
}
然后在创建五个线程的时候传入同一个自定义类;
package ThreadAnimation;
import java.util.Random;
public class demoThread extends Thread{
demo d;
public demoThread(demo d) {
super();
this.d = d;
}
public void run()
{
while(d.id<15)
{
d.print();
}
}
public static void main(String[] args)
{
System.out.println(Thread.currentThread()+"_:)");
demo a=new demo();
for(int i=0;i<5;i++)
{
demoThread dt=new demoThread(a);
dt.start();
}
}
}
执行结果如下
嗯…我们发现线程执行的顺序不同,每个线程执行的次数也不是平均相同的,
重要的是,输出的数字是会重复出现的。