`

实现一个简单的多线程

    博客分类:
  • java
阅读更多
一、定义线程
 
1、扩展java.lang.Thread类。
此类中有个run()方法,应该注意其用法:
public void run() 

如果该线程是使用独立的 Runnable 运行对象构造的,则调用该 Runnable 对象的 run 方法;否则,该方法不执行任何操作并返回。

 

 Thread 的子类应该重写该方法。

 

2、实现java.lang.Runnable接口。
void run()

使用实现接口 Runnable 的对象创建一个线程时,启动该线程将导致在独立执行的线程中调用对象的 run 方法。

方法 run 的常规协定是,它可能执行任何所需的操作。

 
二、实例化线程
1、如果是扩展java.lang.Thread类的线程,则直接new即可。
2、如果是实现了java.lang.Runnable接口的类,则用Thread的构造方法:
Thread(Runnable target)
Thread(Runnable target, String name)
Thread(ThreadGroup group, Runnable target)
Thread(ThreadGroup group, Runnable target, String name)
Thread(ThreadGroup group, Runnable target, String name, long stackSize)
 
三、启动线程
 
在线程的Thread对象上调用start()方法,而不是run()或者别的方法。
在调用start()方法之前:线程处于新状态中,新状态指有一个Thread对象,但还没有一个真正的线程。
在调用start()方法之后:发生了一系列复杂的事情
      启动新的执行线程(具有新的调用栈);
      该线程从新状态转移到可运行状态;
      当该线程获得机会执行时,其目标run()方法将运行。
 
注意:对Java来说,run()方法没有任何特别之处。像main()方法一样,它只是新线程知道调用的方法名称(和签名)。因此,在Runnable上或者Thread上调用run方法是合法的。但并不启动新的线程。
 
四、例子
package thread_test;

/**
 * 测试Runnable类实现的多线程程序 
 * 
 * @author ciding 
 * @createTime Dec 7, 2011 9:38:52 AM
 *
 */
public class TestRunnable { 
    public static void main(String[] args) { 
    	StrRunnable sr1 = new StrRunnable("chenfengbin");
    	StrRunnable sr2 = new StrRunnable("cidng");

        Thread t1 = new Thread(sr1);
        Thread t2 = new Thread(sr2);

        t1.start(); 
        t2.start(); 
        
        StrThread st1 = new StrThread("chenfengbin");
        StrThread st2 = new StrThread("cidng");

        Thread t3 = new Thread(st1);
        Thread t4 = new Thread(st2);

        t3.start(); 
        t4.start(); 
    }
}

/**
 * 通过实现接口的多线程
 * 
 * @author ciding 
 * @createTime Dec 8, 2011 10:20:28 PM
 *
 */
class StrRunnable  implements Runnable { 
    private String name; 

    public StrRunnable(String name) { 
        this.name = name; 
    } 

    public void run() { 
        for (int i = 0; i < 3; i++) { 
        	for(long j=0;j<100000000;j++);	//用来模拟一个非常耗时的操作,方便显示多线程效果。
            System.out.println("Runnable下的" + name + ": " + i);
        } 
    } 
}

/**
 * 通过继承类的多线程
 * 
 * @author ciding 
 * @createTime Dec 8, 2011 10:20:50 PM
 *
 */
class StrThread extends Thread{
	private String name;
	
	public StrThread(String name){
		this.name = name;
	}
	
	public void run() { 
        for (int i = 0; i < 3; i++) { 
        	for(long j=0;j<100000000;j++);	//用来模拟一个非常耗时的操作,方便显示多线程效果。
            System.out.println("Thread下的" + name + ": " + i);
        } 
    }
}
 
运行结果:
Runnable下的chenfengbin: 0
Runnable下的cidng: 0
Thread下的chenfengbin: 0
Thread下的cidng: 0
Runnable下的chenfengbin: 1
Runnable下的cidng: 1
Thread下的chenfengbin: 1
Thread下的cidng: 1
Runnable下的chenfengbin: 2
Thread下的chenfengbin: 2
Runnable下的cidng: 2
Thread下的cidng: 2
 
 思考问题:
       1,直接调用run()方法,与一般程序有区别吗?会启动一个新的线程吗?那启动一个新线程是怎么运做的呢。
       2,线程有名字吗?
       3,线程是怎么调度的呢?我们是不是影响线程调度的方式。
       4,线程有哪些运行状态?
       5,线程都有哪些常见方法?
是的,这些问题将在后面的环节一一解答。
Java线程及线程池专题:http://ciding.iteye.com/admin/blogs/1300110
 
 
1
1
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics