可爱的静静 发表于 2017-8-16 18:34:10

java 笔记 多线程 二

多线程
Run和start 特点

为什么不直接用run 而用Start

例子:
package UI;

import java.lang.Thread;

public class sport {
       

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

                walk a=new walk();
                a.run();
                for(int i=0;i<10;i++)
                        System.out.println("swing"+i);
               
        }
}

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

结果:
   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运行后 什么都没有出现
例如:import java.lang.Thread;

public class sport {
       

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

                Thread a=new Thread();
                a.run();}
       
}



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

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

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


创建2个线程例子:

例子:
package UI;

import java.lang.Thread;

public class sport {
       

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

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

class walk extends Thread{
        private String name;
        walk(String name){
                this.name=name;
               
        }
        public void run(){
                for(int i=0;i<10;i++)
                        System.out.println(name+i);
        }
}




获取线程的对象以及名称

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

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

class walk extends Thread{
        private String name;
        walk(String name){
                this.name=name;
               
        }
        public void run(){
                for(int i=0;i<10;i++)
                        System.out.println(this.getName()+name+i);
        }
}

输出结果:
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 类型
例子:        public static void main(String[] args) {
                // TODO Auto-generated method stub
                walk a=new walk("hahh");
                a.start();
                for(int i=0;i<10;i++)
                        System.out.println("swing"+i);
                       
        }
}

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

获取当前对象:
StaticThread .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]
查看完整版本: java 笔记 多线程 二