第一種:(Thread)
package com.abin.lee.servlet.mythread.thread;
public class Mythread extends Thread{
private String name;
public Mythread(String name) {
this.name=name;
}
public void run() {
synchronized(this.name){
System.out.println("開始時間:"+System.currentTimeMillis()+",線程名字:"+Thread.currentThread().getName());
System.out.println("name="+name);
System.out.println("結(jié)束時間:"+System.currentTimeMillis()+",線程名字:"+Thread.currentThread().getName());
}
}
}
測試代碼:
package com.abin.lee.servlet.mythread.thread;
public class MythreadTest {
public static void main(String[] args) {
Mythread mythread1=new Mythread("ManyThread");
Mythread mythread2=new Mythread("ManyThread");
mythread1.start();
mythread2.start();
}
}
第二種:(Runnable)
package com.abin.lee.servlet.mythread.runnable;
public class MyRunnable implements Runnable{
private String name;
public MyRunnable(String name) {
this.name=name;
}
public synchronized void run(){
System.out.println("開始時間:"+System.currentTimeMillis()+",線程名字:"+Thread.currentThread().getName());
System.out.println("name="+name);
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("結(jié)束時間:"+System.currentTimeMillis()+",線程名字:"+Thread.currentThread().getName());
}
}
測試代碼:
package com.abin.lee.servlet.mythread.runnable;
public class MyRunnableTest {
public static void main(String[] args) {
MyRunnable myRunnable=new MyRunnable("ManyThread");
Thread thread1=new Thread(myRunnable);
Thread thread2=new Thread(myRunnable);
thread1.start();
thread2.start();
}
}
第三種:(Callable)這種說明一下,這個實(shí)現(xiàn)多線程的方式是在JDK1.5引進(jìn)的,在java.util.concurrent.Callable 這個并發(fā)包下面,并且提供同步返回結(jié)果的多線程。
package com.abin.lee.servlet.mythread.callable;
import java.util.concurrent.Callable;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class MyCallable implements Callable<String>{
private String name;
public MyCallable(String name) {
this.name=name;
}
public String call() throws Exception {
Lock lock=new ReentrantLock();
lock.lock();
String result="";
try {
System.out.println("開始時間:"+System.currentTimeMillis()+",線程名字:"+Thread.currentThread().getName());
System.out.println("name="+name);
if(name.equals("ManyThread")){
result="success";
}else{
result="failure";
}
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("結(jié)束時間:"+System.currentTimeMillis()+",線程名字:"+Thread.currentThread().getName());
} catch (Exception e) {
e.printStackTrace();
}finally{
lock.unlock();
}
return result;
}
}
測試代碼:
package com.abin.lee.servlet.mythread.callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import org.junit.Test;
public class MyCallableTest {
@Test
public void testMyCallable() throws InterruptedException, ExecutionException{
ExecutorService executor=Executors.newFixedThreadPool(3);
MyCallable myCallable=new MyCallable("ManyThread");
Future future1=executor.submit(myCallable);
System.out.println("future1="+future1.get());
Future future2=executor.submit(myCallable);
System.out.println("future2="+future2.get());
Future future3=executor.submit(myCallable);
System.out.println("future3="+future3.get());
}
}
測試結(jié)果:
開始時間:1350056647659,線程名字:pool-1-thread-1
name=ManyThread
結(jié)束時間:1350056650661,線程名字:pool-1-thread-1
future1=success
開始時間:1350056650661,線程名字:pool-1-thread-2
name=ManyThread
結(jié)束時間:1350056653661,線程名字:pool-1-thread-2
future2=success
開始時間:1350056653662,線程名字:pool-1-thread-3
name=ManyThread
結(jié)束時間:1350056656663,線程名字:pool-1-thread-3
future3=success