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]