鱼C论坛

 找回密码
 立即注册
查看: 2568|回复: 0

[学习笔记] java 笔记 多线程 二

[复制链接]
发表于 2017-8-16 18:34:10 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
多线程
Run  和start 特点

为什么不直接用run 而用Start

例子:
  1. package UI;

  2. import java.lang.Thread;

  3. public class sport {
  4.        

  5.         public static void main(String[] args) {
  6.                 // TODO Auto-generated method stub

  7.                 walk a=new walk();
  8.                 a.run();
  9.                 for(int i=0;i<10;i++)
  10.                         System.out.println("swing"+i);
  11.                
  12.         }
  13. }

  14. class walk extends Thread{
  15.         public void run(){
  16.                 for(int i=0;i<10;i++)
  17.                         System.out.println("walk"+i);
  18.         }
  19. }

复制代码
结果:
     walk0
walk1
walk2
walk3
walk4
walk5
walk6
walk7
walk8
walk9
swing0
swing1
swing2
swing3
swing4
swing5
swing6
swing7
swing8
swing9


从结果看也就是先全部执行完run方法输出完walk+i 再接下来执行输出swing+i ,也就是没有run方法和main主线程没有同时执行,虽然new的时候创建了线程 但是没有用start()就没有启动线程就是没有启动多一条线程,start()的作用就是创建新的线程和调用run方法


为什么要覆盖run方法呢?
假设只是new 一个Thread对象 然后调用run或者start  运行后 什么都没有出现
例如:
  1. import java.lang.Thread;

  2. public class sport {
  3.        

  4.         public static void main(String[] args) {
  5.                 // TODO Auto-generated method stub

  6.                 Thread a=new Thread();
  7.                 a.run();}
  8.        
  9. }
复制代码



运行后并没有什么输出结果,所以Thread类的run方法原本就没有方法体, 那就要想想如何把想创建线程后的代码存在run方法里,那就继承Thread类,然后把想要执行的代码存在run方法里

总结:
start ():开启线程 并执行run方法

run:()存储线程运行的代码


创建2个线程例子:

例子:
  1. package UI;

  2. import java.lang.Thread;

  3. public class sport {
  4.        

  5.         public static void main(String[] args) {
  6.                 // TODO Auto-generated method stub

  7.                 walk a=new walk("swing");//创建一个线程
  8.                 walk b=new walk("walk");//创建第二个线程
  9.                 a.start();//开启线程  调用run方法
  10.                 b.start();//开启线程   调用run方法
  11.                 for(int i=0;i<10;i++)//主线程执行这个和 上面两个线程一起执行
  12.                         System.out.println("swing"+i);
  13.                        
  14.         }
  15. }

  16. class walk extends Thread{
  17.         private String name;
  18.         walk(String name){
  19.                 this.name=name;
  20.                
  21.         }
  22.         public void run(){
  23.                 for(int i=0;i<10;i++)
  24.                         System.out.println(name+i);
  25.         }
  26. }



复制代码

获取线程的对象以及名称

获取名称 :getName()
设置线程名称1. setName()
             2.Thread 的构造方法 参数是 String 类型
例子:
  1. public class sport {
  2.        

  3.         public static void main(String[] args) {
  4.                 // TODO Auto-generated method stub
  5.                 walk a=new walk("swing");
  6.                 a.start();
  7.                 for(int i=0;i<10;i++)
  8.                         System.out.println("swing"+i);
  9.                        
  10.         }
  11. }

  12. class walk extends Thread{
  13.         private String name;
  14.         walk(String name){
  15.                 this.name=name;
  16.                
  17.         }
  18.         public void run(){
  19.                 for(int i=0;i<10;i++)
  20.                         System.out.println(this.getName()+name+i);
  21.         }
  22. }
复制代码

输出结果:
swing0
Thread-0swing0
swing1
Thread-0swing1
swing2
Thread-0swing2
swing3
swing4
swing5
swing6
swing7
swing8
swing9
Thread-0swing3
Thread-0swing4
Thread-0swing5
Thread-0swing6
Thread-0swing7
Thread-0swing8
Thread-0swing9

也就是说 线程有默认的名称 我们可以给线程名称不用默认名称有两种方法:1. setName()
             2Thread 的构造方法 参数是 String 类型
例子:
  1. public static void main(String[] args) {
  2.                 // TODO Auto-generated method stub
  3.                 walk a=new walk("hahh");
  4.                 a.start();
  5.                 for(int i=0;i<10;i++)
  6.                         System.out.println("swing"+i);
  7.                        
  8.         }
  9. }

  10. class walk extends Thread{
  11.         walk(String name){
  12.                 super(name);
  13.         }
  14.         public void run(){
  15.                 for(int i=0;i<10;i++)
  16.                         System.out.println(this.getName()+"---"+i);
  17.         }
  18. }
复制代码
这个是用结构方法给线程名称 ,子类walk是自己定义的类也是自己定义的结构方法,所以即使传了参数进来子类也没有方法体可以给线程名称,但是父类有参数结构方法可以给线程名称,在继承里父类结构方法是默认调用没有参数的,如果是调用有参数的就super(参数)

获取当前对象:
Static  Thread .currentThread();
例子: class walk extends Thread{
        walk(String name){
                super(name);
        }
        public void run(){
                for(int i=0;i<10;i++)
                System.out.println(Thread .currentThread().getName()+"---"+i);//Thread.currentThread获取了对象 代替了之前的this
        }
}

评分

参与人数 1鱼币 +3 收起 理由
小甲鱼 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 13:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表