- 线程简介
- 大体理解
- 解决多任务问题,
- 多线程 多条路径同时进行
- 一个进程会有多个线程
- 一个进程匹配一个程序
- 一个进程中开辟多条路径就是多线程
- 多线程相当于开辟了多条路,相互不影响
- 解决多任务问题,
- 进程与线程区别:
- 操作系统—>进程—>线程
- 进程
- 资源分配的最小单位
- 切换开销大
- 有独立的代码跟数据空间
- 线程
- 调度跟执行的最小单位
- 多个线程共享一个进程下的资源
- 每个线程会有独立的运行栈和程序计数器(PC)
- 切换开销小
- 核心概念
- 线程是独立的执行路径
- 在程序运行时,即使自己没有创建线程,后台也会有多个线程
- main()称为主线程,为系统入口点
- 在一个进程中,开辟多个线程,线程运行由调度器安排
- 调度器与操作系统紧密连接,顺序人为无法控制
- 同一份资源操作时,会存在资源抢夺问题,需要有并发控制
- 主内存–>多个工作内存–>对应自己的线程
- 多线程代表多条路
- 每一条路有自己的工作空间
- 底层运行机制:
- 当多个线程同时进行时,CPU会每个线程只做一部分,然后依次同时做,看起来像同时进行一样
- 生命周期
- 代码部分
- 1.继承Thread类
package Xiancheng;
public class Demo1 {
public static void main(String[] args) {
//两个线程同时进行,执行顺序与CPU有关
Thread a=new ThreadA();
a.start();//使用start运行
Thread b=new ThreadB();
b.start();
}
}
class ThreadA extends Thread{
@Override
public void run() {//重写run方法
for(int i=0;i<=100;i++){
System.out.println(i);
try {
Thread.sleep(1000);//停顿1s 1000ms
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class ThreadB extends Thread{
@Override
public void run() {
for(char i='a';i<='z';i++){
System.out.println(i);
try {
Thread.sleep(1000);//停顿1s 1000ms
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
运行结果就不演示了
- 2.Runnable接口
package Xiancheng;
import javax.swing.*;
import java.awt.*;
import java.net.URL;
import java.sql.Connection;
public class Demo2 extends JFrame implements Runnable{
private JLabel j1=new JLabel();
private int count=0;
private Container container=getContentPane();//声明容器
public Demo2(){
setBounds(400,200,1000,800);
container.setLayout(null);
try{
URL url=Demo2.class.getResource("Spyder.png");
Icon icon=new ImageIcon(url);//实例化一个Icon
j1.setIcon(icon);//将图标放置在标签中
}catch (NullPointerException ex){
return;
}
j1.setHorizontalAlignment(SwingConstants.LEFT);
j1.setBounds(100,100,300,300);
j1.setOpaque(true);
container.add(j1);
setVisible(true);
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
}
public static void main(String[] args) {
Demo2 frame=new Demo2();
Thread t=new Thread(frame);
t.start();
}
@Override
public void run() {
int count=10;
while (true){
j1.setBounds(count,100,500,400);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
count+=5;
if(count>=200){
count=10;
}
}
}
}
运行结果如下:
第一次做GIF动画,还附带水印,大家就将就的看吧,不好意思。