Java那些事之多线程
Java中的多线程经常被使用,而且功能还是比较强大的。下面来简单介绍一下。
本人经常使用的多线程方式是去实现Runnable的run方法,然后在外面用start方法进行调用。这样感觉思路更清晰一些。
好了,上代码,一看就明白了。
比如我要设计一个线程A.
代码如下:
public class ThreadA implements Runnable
{
/*
* (non-Javadoc)
* @see java.lang.Runnable#run()
* 启动线程
*/
public void run() {
System.out.println("A started");
}
}
{
/*
* (non-Javadoc)
* @see java.lang.Runnable#run()
* 启动线程
*/
public void run() {
System.out.println("A started");
}
}
OK,很简单吧。A线程定义完毕。
下面进行A线程启动的调用
ThreadA a = new ThreadA();
Thread thread_a = new Thread(a);
thread_a.start();
Thread thread_a = new Thread(a);
thread_a.start();
既然是多线程,我们看看下个线程B。为了实现线程的切换,我们假设B要等到A完成之后再开始。看看怎么写吧
首先还是定义
public class ThreadB implements Runnable
{
private ThreadA threada;
public ThreadB(ThreadA a)
{
this.threada = a ;
}
/*
* (non-Javadoc)
* @see java.lang.Runnable#run()
* 启动线程
*/
public void run() {
synchronized(threada ) {
try {
a.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("B started");
}
}
{
private ThreadA threada;
public ThreadB(ThreadA a)
{
this.threada = a ;
}
/*
* (non-Javadoc)
* @see java.lang.Runnable#run()
* 启动线程
*/
public void run() {
synchronized(threada ) {
try {
a.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("B started");
}
}
外层的调用也是一样
ThreadB b = new ThreadB();
//这是唯一的区别
Thread thread_b = new Thread(a);
thread_b.start();
//这是唯一的区别
Thread thread_b = new Thread(a);
thread_b.start();
这样一来,线程B也大功告成了。
下面是关键的地方,注意到B线程开始在wait(),什么时候执行呢?
因此我们需要在一个地方去唤醒B线程,考虑到我们假设的场景是A执行之后去执行B线程,那么A线程后面需要加一下唤醒。
public class ThreadA implements Runnable
{
/*
* (non-Javadoc)
* @see java.lang.Runnable#run()
* 启动线程
*/
public void run() {
System.out.println("A started");
synchronized(this) {
notifyAll();
}
}
{
/*
* (non-Javadoc)
* @see java.lang.Runnable#run()
* 启动线程
*/
public void run() {
System.out.println("A started");
synchronized(this) {
notifyAll();
}
}
这样一来,就可以实现我们的效果了。