23.java当中的线程

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





转载于:https://www.cnblogs.com/arroneve/p/5815464.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值