标签:
学了线程,收获不少,记录下了吧.
一、线程的主要两种实现方法。
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();
}
}
标签:
原文地址:http://www.cnblogs.com/xmhjy/p/5224507.html