鱼C论坛

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

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

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

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

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

x
多线程
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(参数)

获取当前对象:
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-12-23 12:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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