方法一: 用繼承Thread實現
實例:
package threadtest13;
//多線程的寫法2,用兩種情況變換,
//情況1:新建一個對象,兩個線程共享一個對象。另外是新建兩個對象,兩個線程用兩個對象
//情況2:int i=0;拿到run()外面與在run()裏面兩種情況。
//上面4種情況可以排列組合試一下
publicclass Thread13 {
publicstaticvoid main(String args[]){
MyThread myThread =new MyThread();
// MyThread myThread2= new MyThread();//2
Thread t1=new Thread(myThread);
Thread t2=new Thread(myThread);
//Thread t2= new Thread(myThread2); //2
t1.start();
t2.start();
}
}
class MyThread extends Thread {
// int i=0;//1
publicvoid run() {
String name = Thread.currentThread().getName();
String inf=Thread.currentThread().toString();
long idnum = Thread.currentThread().getId();
for(int i=0;i<10;i++){//不管是新建一個對象,還是兩個對象,//2,都是打印20個數據
// for(;i<10;i++){//新建一個對象的時候,打印11個左右的數據 ,新建兩個對象的時候,//2,會打印20個數據。//1
System.out.println("i----------"+i +",thread name=="+ name
+",threadid=="+ idnum+",thread inf=="+inf);
}
}
}
實例:
package com.thread.test;
publicclass ThreadTest extends Thread {
public ThreadTest(String str){//用構造函數控制線程的名字,如果不寫,默認是thread-整數
super(str);
}
@Override
publicvoid run() {
synchronized(this){
for(int i=0;i<10;i++){//控制run的內部這些東西執行的次數,不加這句,run只執行一次。
System.out.println(i+getName());
try {
sleep((long)(Math.random()*1000));
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//for循環結束
System.out.println("for循環結束"+getName());
}
super.run();
}
/*
* 此方法可添加也可以不填加,start都能夠調用。
* @Override
public synchronized void start() {
// TODO Auto-generated method stub
super.start();
}*/
publicstaticvoid main(String args[]){
new ThreadTest("su").start();
new ThreadTest("zhu").start();
}
}
上面方法兩個線程不能同步。
方法二:用“實現”Runnable方法實現
實例:
代碼
package threadtest12;
//多線程的寫法1
publicclass Thread12 {
publicstaticvoid main(String args[]) {
MyThread myThread =new MyThread();
//myThread.run();
//把這個MyThread包裝稱爲Thread
Thread t1 =new Thread(myThread);
Thread t2=new Thread(myThread);
t1.start();
t2.start();
}
}
class MyThread implements Runnable {
@Override
publicvoid run() {
// TODO Auto-generated method stub
String name = Thread.currentThread().getName();
String inf=Thread.currentThread().toString();
long idnum = Thread.currentThread().getId();
for(int i=0;i<10;i++){
System.out.println("aaaaa----------"+",thread name=="+ name
+",threadid=="+ idnum+",thread inf=="+inf);
}
}
}
兩個共享一個thread對象,併發調用,20條數據
實例:
/*
*
*
* 這段代碼用實現接口來做
* 可以讓類extends繼承其他類*/
package com.thread.test1;
publicclass ThreadTest1 implements Runnable{
String threadName;
public ThreadTest1(String str){
threadName=str;
}
@Override
publicvoid run() {
// TODO Auto-generated method stub
for(int i =0;i<10;i++){
System.out.println("執行第"+i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//System.out.println("執行完第"+i);
}
System.out.println("結束");
}
publicstaticvoid main(String[] args){
/*
* 這段跟下面的作用是一樣的。。。new的ThreadTest1的對象不能調用start方法
* ThreadTest1 threadTest1=new ThreadTest1("h");
Thread thread1=new Thread(threadTest1);
thread1.start();*/
new Thread(new ThreadTest1("su")).start();
}
}