- 进程和线程
- 多线程:在操作系统中能(同时)运行多个任务(程序)
- 多线程:在同一应用程序中有多个顺序流(同时)执行
- 线程的执行过程
- 线程的执行过程
- 创建线程的方法
- 方法1:定义一个线程类,他继承类Thread并重写其中的方法run(),方法run(),称为线程体;由于java只支持单继承,用这种方法定义的类不能继承其他类
- 多线程程序运行模式及方法
- 定义一个类FirstThread继承Thread,之后用复写的方法,线程执行的时候,执行的是run()中的代码
- 生成FirstThread的对象,然后调用对象线程的start()方法,则该线程进入就绪状态,抢到CPU就进入执行状态
classFirstThread extends Thread{
publicvoid run(){
for(int i =0; i <10; i++){
System.out.println("FirstThread-->"+ i);
}
}
}
classTest{
publicstaticvoid main(String arg []){
//生成线程的对象
FirstThread ft =newFirstThread();
//启动线程
//ft.run(); 千万不能这样写,这样就是单线程,会先执行run()中的方法
ft.start();
//线程交替运行,并且没有规律
for(int i =0; i <10; i++){
System.out.println("main-->"+ i);
}
}
}
结果:
D:\work\src>javac *.java
D:\work\src>java Test
main-->0
FirstThread-->0
main-->1
FirstThread-->1
main-->2
main-->3
FirstThread-->2
FirstThread-->3
main-->4
main-->5
FirstThread-->4
main-->6
main-->7
FirstThread-->5
FirstThread-->6
main-->8
FirstThread-->7
main-->9
FirstThread-->8
FirstThread-->9
- 多线程数据安全
- 多线程共用数据的时候,会出现错误,需要引入同步代码块
- 同步线程的方法
- 使用:synchronized(this)
classMyThread implements Runnable{
int i =10;
publicvoid run(){
while(true){
/*
synchronized称为同步代码块;
this代表调用run()方法的对象,称为同步锁;
功能:获得同步锁才有资格运行代码;
**/
synchronized(this){
/*
currentThread()是Thread的静态方法,获取当前代码在哪个线程中运行;
Thread.currentThread().getName()可以获得线程的名字;
**/
System.out.println(Thread.currentThread().getName()+ i);
i--;
Thread.yield();
if(i <0){
break;
}
}
}
}
}
classTest{
publicstaticvoid main(String arg []){
MyThread myThread =newMyThread();
//生成两个Thread对象,但是这两个Thread对象共用一个线程体
Thread t1 =newThread(myThread);
Thread t2 =newThread(myThread);
/*每一个线程都有名字,可以通过Thread对象的setName()方法设置
也可以使用getName方法来获取线程的名字;**/
t1.setName("线程a");
t2.setName("线程b");
//分别启动两个线程
t1.start();
t2.start();
}
}
结果是:
D:\work\src>javac *.java
D:\work\src>java Test
线程b10
线程b9
线程b8
线程b7
线程b6
线程b5
线程b4
线程b3
线程b2
线程b1
线程b0
线程a-1
时间: 2024-10-20 08:25:13