什么是线程?
Thread类中有这样的明确定义:线程是程序中执行的线程,Java虚拟机允许程序同时运行多个执行线程。
线程状态:
- 新建:当使用new操作符创建新线程时,线程处于“新建“状态
- 运行(可运行):调用start()方法
- 阻塞:当线程需要获得对象的内置锁,而该锁正在被其他线程拥有
- 等待:当线程等待其他线程通知调度表可以运行时
- 计时等待:对于一些含有时间参数的方法,如Thread类的sleep()
- 终止:当run()方法运行完毕或出现异常时
使用线程的意义:
- 更高的运行效率,——并行;
- 多线程是模块化的编程模型;
- 与进程相比,线程的创建和切换开销更小;
- 通信方便;
- 能简化程序的结构,便于理解和维护;更高的资源利用率。
注意:多线程上下文切换的性能损耗:上下文切换(线程切换,进程切换,模式切换,地址空间切换)
线程创建:
- 方法一:声明一个类是Thread类
在这个类中必须要有run方法,在run方法中实现具体的功能:
class MyThread extends Thread {
public void run() {
//具体的方法
System.out.println(Calendar.getInstance().getTime());//系统时间
}
}
然后创建一个线程并使用start()使其开始运行:
MyThread myThread=new MyThread();
myThread.start();
- 方法二:声明一个实现 Runnable接口的类
实现 Runnable接口的类, 在该类中实现 run 方法,:
class MyThreard implements Runnable {
public void run() {
System.out.println(Calendar.getInstance().getTime());
}
}
然后创建一个线程并开始运行:
MyThreard p = new MyThreard();
new Thread(p).start();
实例展示:
- 一个线程顺序执行
package test;
/**
* @User: idnihai
* @Date: 17:11 2020/8/11
*/
public class TestMythread extends Thread{
public static void main(String [] args){
TestMythread testMythread = new TestMythread();
testMythread.start();
}
public void run(){
for(int i=0;i<10;i++){
System.out.println(currentThread().getName()+" "+i);
}
for(int i=0;i<10;i++){
System.out.println(currentThread().getName()+" "+i);
}
}
}
运行结果:
Thread-0 0
Thread-0 1
Thread-0 2
Thread-0 3
Thread-0 4
Thread-0 5
Thread-0 6
Thread-0 7
Thread-0 8
Thread-0 9
Thread-0 0
Thread-0 1
Thread-0 2
Thread-0 3
Thread-0 4
Thread-0 5
Thread-0 6
Thread-0 7
Thread-0 8
Thread-0 9
- 两个及以上:
package test;
/**
* @User: idnihai
* @Date: 17:11 2020/8/11
*/
public class TestMythread extends Thread{
public static void main(String [] args){
TestMythread testMythread = new TestMythread();
testMythread.start();
TestMythread testMythread1 = new TestMythread();
testMythread1.start();
}
public void run(){
for(int i=0;i<10;i++){
System.out.println(currentThread().getName()+" "+i);
}
}
}
运行结果:
Thread-1 0
Thread-0 0
Thread-1 1
Thread-0 1
Thread-1 2
Thread-0 2
Thread-1 3
Thread-0 3
Thread-1 4
Thread-0 4
Thread-1 5
Thread-0 5
Thread-1 6
Thread-1 7
Thread-1 8
Thread-0 6
Thread-1 9
Thread-0 7
Thread-0 8
Thread-0 9
- 多线程绘制小球:
创建多个线程实现同时进行多个小球的移动路径绘制
public void run(){
for(int i=0;i<400;i++){
g.fillOval(x+i*2,y,30,30);
//延时
try{
Thread.sleep(30);//
}catch(Exception ef){}
}
展示:
问题:
多线程绘制时存在画面闪烁问题。