java编写线程
编写线程有两种方式:一种是创建Thread子类并重写run方法
一种是创建类的时候实现Runnable接口,在myRunnable类中实现
下面为第一种创建Thread子类并重写run方法
package test.examples; public class myThread extends Thread{ public void run(){ System.out.println("mythread running"); } public static void main(String[] args) { myThread my = new myThread(); my.start(); //创建一个Thread的匿名子类 Thread thread = new Thread(){ public void run(){ 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 void run(){ System.out.println("Thread" + getName() + "running"); } }.start(); } } }
创建类的时候实现Runnable接口
package test.examples; public class myRunnable implements Runnable{ @Override public void run() { System.out.println("myRunnable running"); } public static void main(String[] args){ //需要在Thread类的构造函数中传入myRunnable的实例对象 Thread thread = new Thread(new myRunnable()); thread.start(); //创建一个实现了Runnable接口的匿名类 Runnable my = new Runnable(){ public void run(){ System.out.println("Runnable running"); } }; Thread thread1 = new Thread(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();得到当前线程的名字