编写线程有两种方式:一种是创建Thread子类并重写run方法
一种是创建类的时候实现Runnable接口,在myRunnable类中实现
下面为第一种创建Thread子类并重写run方法
packagetest.examples;
public class myThread extendsThread{public voidrun(){
System.out.println("mythread running");
}public static voidmain(String[] args)
{
myThread my= newmyThread();
my.start();//创建一个Thread的匿名子类
Thread thread = newThread(){public voidrun(){
System.out.println("Thread running");
}
};
thread.start();/** 尽管启动线程是有顺序的,但是执行线程的顺序并非是有序的
* 因为线程是并发执行而非顺序
* JVM与操作系统一起决定了线程的执行顺序,与线程的启动顺序并非一致*/System.out.println(Thread.currentThread().getName());for(int i=0;i<10;i++){new Thread(""+i){public voidrun(){
System.out.println("Thread" + getName() + "running");
}
}.start();
}
}
}
创建类的时候实现Runnable接口
packagetest.examples;public class myRunnable implementsRunnable{
@Overridepublic voidrun() {
System.out.println("myRunnable running");
}public static voidmain(String[] args){//需要在Thread类的构造函数中传入myRunnable的实例对象
Thread thread = new Thread(newmyRunnable());
thread.start();//创建一个实现了Runnable接口的匿名类
Runnable my = newRunnable(){public voidrun(){
System.out.println("Runnable running");
}
};
Thread thread1= newThread(my);
thread1.start();
}
}
两种方法并没有好坏之分,线程池的有效管理实现了Runnable接口的线程,如果线程池满了新的线程就会排队等候执行,
直到线程池空闲出来为止。如果线程是通过实现Thread子类实现的,会复杂一些
常见错误:调用run()方法而非start()方法
myThread my = new myThread();
my.run();
起初不会觉得什么,事实上run()方法并非是由刚创建的新线程所执行的,而是被新创建新线程的当前线程所执行,也就是被执行上面两行代码的线程所执行想要让创建的新线程执行run()方法,必须调用新线程的start()方法
创建新线程的时候可以给线程起个名字,有助于区分不同的线程,如下:
myRunnable runnable = new myRunnable();
Thread thread = new Thread(runnable,"new Thread");
thread.start();
System.out.println(thread.getName());
Thread.currentThread();可以得到当前线程的引用
String threadName = Thread.currentThread().getName();得到当前线程的名字