一个简单的多线程的例子:
package multiThread; public class BasicThread implements Runnable{ private int countDown = 10; private static int taskCount = 0; private final int id = taskCount++; public static void main(String [ ] args) { Thread t = new Thread(new BasicThread()); t.setName("test_thread1"); t.start(); //not t.run(); t.run() will not start a new thread,just exist one thread System.out.println("i am finished!"); } @Override public void run() { while(countDown>=0){ System.out.print("#"+ id + "(" + (countDown>0 ? countDown : "lift off!") + "),"); countDown --; } } }
运行的结果为:
i am finished! #0(10),#0(9),#0(8),#0(7),#0(6),#0(5),#0(4),#0(3),#0(2),#0(1),#0(lift off!),
关于上面的代码有几点说明一下:
1.final int id = taskCount++,final修饰基本变量时,值是不变的,从结果可以看到,id的值始终为0。
2.使用t.start()来开启一个线程,而不是t.run(),t.run()还是运行在main方法的线程中,始终只有1个线程。
3.使用t.setName("test_thread1");是一个好的习惯,方便后续的定位问题。
使用setDaemon(true)可以将线程设置为后台线程,后台线程有如下的特点:
1.JVM中只剩下Daemon线程时就会退出,只要还有一个non-Daemon线程存活,JVM就不会退出。Daemon线程可以在做一些后台的服务性工作,例如JVM的gc线程就是一个低优先级的Daemon线程。
2.线程启动时,默认是non-Daemon的。
3.setDaemon(true)一定要在start方法之前,否则回报异常。
4.无法将一个已经启动的non-Daemon线程变为Daemon线程。
5.Daemon线程中产生的新线程默认将是Daemon的。
时间: 2024-11-03 19:20:52