你的位置:首页 > Java教程

[Java教程]线程的2种实现和线程的交替执行


学了线程,收获不少,记录下了吧.

一、线程的主要两种实现方法。

1.继承Thread类,重写run()方法  

   main方法中创建子类,引用调用start()方法

实例如下:

//继承Thread类,重写run()方法      

public class ThreadOne extends Thread {

public void run() {
for (int i = 1; i <=100; i++) {
System.out.println(this.getName()+":"+i);
}
}

public static void main(String[] args) {
//创建Thread对象
ThreadOne threadOne = new ThreadOne();
//调用start()
threadOne.start();

}

}

2.实现Runnable()接口,实现run()方法。

 mian方法中 实例该类,实例Thread类并持有该类的引用 Thread的引用调用start().

实例:

//实现Runnable()接口,实现run()方法

public class MyThread implements Runnable {
public void run() {
for(int i=0; i<10; i++){
System.out.println(Thread.currentThread().getName()+"放入一个苹果:"+i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}

public static void main(String[] args) {

//创建MyThread类
MyThread myThread =new MyThread();

//创建Thread,并持有MyThread的应用
Thread thread = new Thread(myThread);

//调用start()
thread.start();
}
}

二.规律交替执行线程题目

例如问题:实现两个线程能够交替每隔1秒钟打印一次时间,每个线程打印5次后结束线程

结果要求:

Thread-0 Sun Feb 28 11:21:52 CST 2016;
Thread-1 Sun Feb 28 11:21:53 CST 2016
Thread-0 Sun Feb 28 11:21:54 CST 2016
Thread-1 Sun Feb 28 11:21:55 CST 2016
Thread-0 Sun Feb 28 11:21:56 CST 2016
Thread-1 Sun Feb 28 11:21:57 CST 2016
Thread-0 Sun Feb 28 11:21:58 CST 2016
Thread-1 Sun Feb 28 11:21:59 CST 2016
Thread-0 Sun Feb 28 11:22:00 CST 2016
Thread-1 Sun Feb 28 11:22:01 CST 2016

问题分析:

首先要 实现2个线程:功能都是创建时间;其次需要交替执行,就必须加锁synchronized;这些都是可以理解的

重要的是这个锁怎么控制,用什么控制,采用方法为:定义一个static状态值 state ,取值为1,2;

当state=1的时候,执行线程1,线程2等待,执行结束后将state=2,并调用notifyAll() 或者notify()方法;

当state=2的时候,执行线程2,线程1等待,执行结束后将state=1,并调用notifyAll() 或者notify()方法;

最后就剩控制5次的问题了,各自定义2个static int 变量 利用while控制呗,各线程执行一次,相应的变量值加1到5结束

代码:

public class ThreadDate{
//状态值 控制 执行哪个程序用
private static int state =1;
//控制线程一执行的次数
private static int num1 =1;
//控制线程2执行的次数
private static int num2 =1;
public static void main(String[] args) {
//用该类作为锁
final ThreadDate t= new ThreadDate();
//创建第一个线程,并调用start()方法
new Thread(new Runnable() {
public void run() {
//用while num1控制执行次数
while(num1<=5){
//加锁
synchronized (t) {
//首先应状态值判断是不是该执行
if(state!=1){
try {
t.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName()+" "+new Date());

try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//执行结束,状态值改变
state =2;
t.notifyAll();
}
num1++;
}
}
}).start();;

//创建第二个线程,并调用start()方法
new Thread(new Runnable() {
public void run() {
while(num2<=5){
synchronized (t) {
if(state!=2){
try {
t.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName()+" "+new Date());

try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

state =1;
t.notifyAll();
}
num2++;
}
}
}).start();
}
}