线程的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();
}
}

时间: 2024-08-01 11:41:12

线程的2种实现和线程的交替执行的相关文章

java中线程分两种,守护线程和用户线程。

java中线程分为两种类型:用户线程和守护线程. 通过Thread.setDaemon(false)设置为用户线程: 通过Thread.setDaemon(true)设置为守护线程. 如果不设置次属性,默认为用户线程. 区别:主线程结束后用户线程会继续运行,JVM存活:主线程结束后,如果没有用户线程,都是守护线程,则JVM结束. public class Mytest extends Thread { public void run() { for(int i=0;;i++){ try { Th

死锁现象与解决方案,开启线程的2种方式,守护线程,线程VS进程,线程互斥锁,信号量

死锁现象与解决方案 from threading import Thread,Lock,active_count import time mutexA=Lock() # 锁1 mutexB=Lock() # 锁2 class Mythread(Thread): def run(self): self.f1() self.f2() def f1(self): mutexA.acquire() print('%s 拿到A锁' %self.name) mutexB.acquire() print('%

创建线程的两种方式比较Thread VS Runnable

1.首先来说说创建线程的两种方式 一种方式是继承Thread类,并重写run()方法 1 public class MyThread extends Thread{ 2 @Override 3 public void run() { 4 // TODO Auto-generated method stub 5 6 } 7 } 8 //线程使用 9 MyThread mt = new MyThread(); //创建线程 10 mt.start(); //启动线程 另外一种方式是实现Runnabl

开启线程的两种方式,

'''目录1,开启线程的两种方式*****2,线程和进程的区别*****3,线程对象的其他方法和属性4,守护线程5,互斥锁6,死锁现象与递过锁7,信号量'''#1 开启线程的两种方式import timefrom threading import Thread def dask(name): print('%s is running '%name) time.sleep(1) print('%s is done'%name) t=Thread(target=dask,args=('egon',)

启动线程的两种方法的对比

java中Thread类有两种启动方法: 1.Thread.start() 2.Thread.run() 这两种方法的执行效果并不一样.Thread.start()方法是通知"线程规划器"此线程已经准备就绪,等待调用线程对象run()方法,是异步的执行结果. Thread.run()方法则是同步的,并不交给"线程规划器"来处理,而是由调用此线程的线程直接调用线程的run()方法,必须等run()方法中的代码执行完以后才能执行后面的代码 另外,执行start()方法的

创建线程的两种方式

首先我们需要知道什么是线程:是程序执行流的最小单元,包括就绪.阻塞和运行三种基本状态. 举个简单的例子:我们把生活中的两件事吃饭和写作业当作是两个线程,当你正在写作业的时候,爸妈叫你吃饭,你就直接去了,等吃完饭回来后再接着写作业.这就是相当于两个线程其中一个从运行状态转入就绪状态,另一个线程从就绪状态转入运行状态. 创建线程包括继承Thread类和实现Runnable接口两种方式(JDK5.0以后还包括了实现Callable等方式来实现线程,这里不做介绍,感兴趣的小伙伴可以自己查资料),下面介绍

Java线程的几种状态

一. 线程状态类型1. 新建状态(New):新创建了一个线程对象.2. 就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法.该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权.3. 运行状态(Running):就绪状态的线程获取了CPU,执行程序代码.4. 阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行.直到线程进入就绪状态,才有机会转到运行状态.阻塞的情况分三种:(一).等待阻塞:运行的线程执行wait(

(转)java创建线程的两种方法比较

Java提供了线程类Thread来创建多线程的程序.其实,创建线程与创建普通的类的对象的操作是一样的,而线程就是Thread类或其子类的实例对象.每个Thread对象描述了一个单独的线程.要产生一个线程,有两种方法: ◆需要从Java.lang.Thread类派生一个新的线程类,重载它的run()方法:  ◆实现Runnalbe接口,重载Runnalbe接口中的run()方法. 为什么Java要提供两种方法来创建线程呢?它们都有哪些区别?相比而言,哪一种方法更好呢? 在Java中,类仅支持单继承

java创建线程的三种方式及其对比

Java中创建线程主要有三种方式: 一.继承Thread类创建线程类 (1)定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务.因此把run()方法称为执行体. (2)创建Thread子类的实例,即创建了线程对象. (3)调用线程对象的start()方法来启动该线程. package com.thread; public class FirstThreadTest extends Thread{ int i = 0; //重写run方法,run方法的方