(来自Thinking in Jaa 第三版)
第一个:
package com.tjsoft.xndt.demoAction;
public class DemoThread extends Thread {
private static int threadCount = 0;
private int countDown = 5;
public DemoThread(){
super("" + ++threadCount);//给每个线程取个数字的名子
start();
}
public String toString(){
return "#" + getName() + ": " + countDown;
}
public void run(){
while(true){
System.out.println(this);
if(--countDown == 0)
return;
}
}
public static void main(String[] args) throws InterruptedException {
for(int i=0;i<3;i++){
//new DemoThread();
new DemoThread().join();
}
}
}
第二个:
package com.tjsoft.xndt.demoAction;
public class RunnableThread implements Runnable{
private int countDown = 5;
public String toString(){
return "#" + Thread.currentThread().getName() + ": " + countDown;
}
public void run() {
while(true){
System.out.println(this);
if(--countDown == 0)
break;
}
}
public static void main(String[] args) {
for(int i = 1; i<=3; i++){
new Thread(new RunnableThread(),"" + i).start();
}
}
}
第三个:
package com.tjsoft.xndt.demoAction;
public class PriorityThread extends Thread{
private int countDown = 5;
private volatile double d = 0;
public PriorityThread(int priority){
setPriority(priority);
start();
}
public String toString(){
return super.toString() + ":" + countDown;
}
public void run(){
while(true){
// An expensive, interruptable operation:
// 可以看到 线程调度机制 将会优先选择 优先权大的线程 取得CPU时间片
for(int i = 1; i < 5000000; i++)
d = d + (Math.PI + Math.E) / (double)i;
System.out.println(this);
if(--countDown == 0)
return;
}
}
public static void main(String[] args) throws InterruptedException {
for(int i=0;i<2;i++){
new PriorityThread(Thread.MIN_PRIORITY);
}
new PriorityThread(Thread.MAX_PRIORITY);
}
}
第四个:
package com.tjsoft.xndt.demoAction;
/**
* @author Administrator
*
*/
public class InnerThreadDemo {
public static void main(String[] args) {
new InnerThread1("InnerThread1");
new InnerThread2("InnerThread2");
new InnerRunnable1("InnerRunnable1");
new InnerRunnable2("InnerRunnable2");
new ThreadMethod("ThreadMethod").runThread();
}
}
// a named inner class
class InnerThread1{
private int countDown = 5;
private Inner inner;
private class Inner extends Thread{
public Inner(String name){
super(name);
start();
}
public void run(){
System.out.println(this);
if(--countDown == 0) return;
}
public String toString(){
return "#" + getName() + ": " + countDown;
}
}
public InnerThread1(String name){
inner = new Inner(name);
}
}
// an anonymous inner class
class InnerThread2 {
private int countDown = 5;
private Thread t;
public InnerThread2(String name){
t = new Thread(name){
public void run(){
while(true){
System.out.println(this);
if(--countDown == 0) return;
}
}
public String toString(){
return "#" + getName() + ": " + countDown;
}
};
t.start();
}
}
// a named Runnable implementation:
class InnerRunnable1 {
private int countDown = 5;
private Inner inner;
private class Inner implements Runnable{
Thread t;
Inner(String name){
t = new Thread(this,name);
t.start();
}
public void run() {
while(true){
System.out.println(this);
if(--countDown == 0) return;
}
}
public String toString(){
return "#" + t.getName() + ": " + countDown;
}
}
public InnerRunnable1(String name){
inner = new Inner(name);
}
}
//an anonymous Runnable implementation:
class InnerRunnable2{
private int countDown = 5;
private Thread t;
public InnerRunnable2(String name){
t = new Thread(new Runnable(){
public void run(){
while(true){
System.out.println(this);
if(--countDown == 0) return;
}
}
public String toString(){
return "#" + Thread.currentThread().getName() + ": " + countDown;
}
},name);
t.start();
}
}
class ThreadMethod {
private int countDown = 5;
private Thread t;
private String name;
public ThreadMethod(String name){
this.name = name;
}
public void runThread(){
if(t == null){
t = new Thread(this.name){
public void run(){
while(true){
System.out.println(this);
if(--countDown == 0) return;
}
}
public String toString(){
return "#" + getName() + ": " + countDown;
}
};
}
t.start();
}
}