23.java当中的线程
- 进程和线程
- 多线程:在操作系统中能(同时)运行多个任务(程序)
- 多线程:在同一应用程序中有多个顺序流(同时)执行
- 线程的执行过程

- 线程的执行过程

- 创建线程的方法
- 方法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

浙公网安备 33010602011771号