1.什么是进程与线程?
进程: 如:开发工具、QQ、。当你双击能运行的。包含线程。
线程: 是系统中最小的执行单元,一个进程 可以有多个线程。共享进程资源。
线程交互: 互斥 <-----> 同步。
2.线程:
继续 java lang 包 class Thread <-------> interface Runnable 都有一个Run()方法。
1. 创建线程:
1.Thread()
2.Thread(String name)
分配新的Thread
对象。
3.Thread(Runnable target)
分配新的Thread
对象。
4.Thread(Runnable target,String name)
分配新的Thread
对象。
2.线程方法:
0. void run()
如果该线程是使用独立的Runnable
运行对象构造的,则调用该 Runnable
对象的 run
方法;否则,该方法不执行任何操作并返回。
1. void start()
使该线程开始执行--启动线程;
2.
static void sleep(long millis)------线程休眠(暂停执行),
static void
sleep(long millis, int nanos) ----线程休眠(暂停执行),
3.
a.void join()
b.void join(long millis) -------------等待当前线程终止。
c.void join(long millis,int nanos)
3.获取线程引用:
1.static thread
currentThread()
返回对当前正在执行的线程对象的引用。
4.
static void yield()
暂停当前正在执行的线程对象,并执行其他线程。
3.实例:
package cn.lanz.threadrunnable;
public class Actor extends Thread {
//重载run()
public void run() {
System.out.println(getName()+"是一个演员!");
int count=0;
boolean keepRunning=true;
while(keepRunning){
System.out.println(getName()+"登台演出:"+(++count));
if(count==20){
keepRunning=false;
}
//演出场次
if(count%2==0){
try {
//休眠3秒
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
System.out.println(getName()+"的演出结束了");
}
}
package cn.lanz.threadrunnable;
public class Actress implements Runnable {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"是一个演员!");
int count=0;
boolean keepRunning=true;
while(keepRunning){
System.out.println(Thread.currentThread().getName()+"登台演出:"+(++count));
if(count==20){
keepRunning=false;
}
//演出场次
if(count%2==0){
try {
//休眠3秒
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
System.out.println(Thread.currentThread().getName()+"的演出结束了");
}
}
package cn.lanz.threadrunnable;
public class ThreadRunnableTest {
public static void main(String[] args) {
Actor actor=new Actor();
actor.setName("Mr.Thread");
actor.start();
Thread actressThread =new Thread(new Actress(),"Mr.Runnable");
actressThread.start();
}
}
package cn.lanz.threadrunnable.army;
/**
* @描述: 军队线程
* @version 创建时间: 2016-12-7:下午3:18:31
* @E-mail 邮箱:
* @author 作者:
*/
public class AramyRunnable implements Runnable {
//volatile保证 了线程可以正确的读取其他线程的写入值。
volatile boolean keepRunning=true;
@Override
public void run() {
while(keepRunning){
//发动3连击
for(int i=0;i<3;i++){
System.out.println(Thread.currentThread().getName()+":进攻对方["+i+"]次数");
//暂停当前线程,并执行其他线程
Thread.yield();
}
}
System.out.println(Thread.currentThread().getName()+":结束战斗!");
}
}
package cn.lanz.threadrunnable.army;
/**
* @描述: 关键人物
* @version 创建时间: 2016-12-7:下午3:43:43
* @E-mail 邮箱:
* @author 作者:
*/
public class KeyPersonThread extends Thread{
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"开始了战斗!");
//发起了【"+i+"】击
for(int i=0;i<6;i++){
System.out.println(Thread.currentThread().getName()+"左突右杀,攻击唐军");
}
System.out.println(Thread.currentThread().getName()+"战斗结束!");
}
}
package cn.lanz.threadrunnable.army;
/**
* @描述: 舞台
* @version 创建时间: 2016-12-7:下午3:30:43
* @E-mail 邮箱: @126.com
* @author 作者:
*/
public class Stage extends Thread {
@Override
public void run() {
AramyRunnable aramyTaskOfSuiDynasty=new AramyRunnable();
AramyRunnable aramyTaskOfRevolt=new AramyRunnable();
//使用Runnable创建线程
Thread aramyOfSuiDynasty=new Thread(aramyTaskOfSuiDynasty,"清朝");
Thread aramyOfRevolt=new Thread(aramyTaskOfRevolt, "唐朝");
//启动线程
aramyOfSuiDynasty.start();
aramyOfRevolt.start();
//休眠
try {
Thread.sleep(50);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
aramyTaskOfSuiDynasty.keepRunning=false;//
aramyTaskOfRevolt.keepRunning=false;
//线程等待
try {
aramyOfRevolt.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("双方正在厮杀,中间杀出一个重要人物。");
Thread mrCheng=new KeyPersonThread();
mrCheng.setName("张三");
//停止
aramyTaskOfSuiDynasty.keepRunning=false;//
aramyTaskOfRevolt.keepRunning=false;
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
mrCheng.start();
try {
mrCheng.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("战斗结束,人民安居乐业。");
}
public static void main(String[] args) {
new Stage().start();
}
}