星空网 > 软件开发 > 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();
}
}

 




原标题:线程的2种实现和线程的交替执行

关键词:线程

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

金彦箴:https://www.goluckyvip.com/tag/34759.html
金钥匙:https://www.goluckyvip.com/tag/34760.html
金义跨境电商:https://www.goluckyvip.com/tag/34761.html
金鹰计划:https://www.goluckyvip.com/tag/34762.html
金寨到新桥机场专线:https://www.goluckyvip.com/tag/34763.html
金照胤:https://www.goluckyvip.com/tag/34764.html
怎样做出一个有利可图的SaaS产品?:https://www.kjdsnews.com/a/1836639.html
【再放信号】美国Etsy即将放开中国卖家入驻,官方邮件你收到了吗?:https://www.kjdsnews.com/a/1836640.html
相关文章
我的浏览记录
最新相关资讯
海外公司注册 | 跨境电商服务平台 | 深圳旅行社 | 东南亚物流