Java多线程复习_Java多线程复习

一、线程的基本概念

简单的说:线程就是一个程序里不同的执行路径

在同一个时间点上cpu只会有一个线程在执行

Java里的多线程是通过java.lang.Thread类来实现的

每个线程都拥有自己独立的方法栈空间

二、java线程的创建和启动

第一种

定义线程类实现Runnable接口

Thread myThread = new Thread(target) //target为Runnable接口类型

Runnable中只有一个方法:

public void run();用以定义线程运行体

第二种

可以定义一个Thread的子类并重写其run方法:

clas MyThread extends Thread{

public void run(){}

}

线程类必须通过执行Thread的start()方法启动一个新的线程

如果调用run()方法是属于方法的调用,不会启动一个新的线程

推荐使用第一种方式创建线程,使用接口较为灵活

二、线程状态装换

调用线程start()方法时,线程进入就绪状态,Cpu分配时间片,线程进入运行状态

时间片结束,run()方法未执行完,线程进入阻塞状态。

三、线程控制基本方法

isAlive() //判断线程是否还“活着”,即线程是否还未终止

getPriority() //获得线程的优先级数值

setPriority() //设置线程的优先级指数

Thread.sleep() //静态方法,将当前线程睡眠指定毫秒数

join()  //调用某线程的该方法,将当前线程与该线程合并,即等待该线程结束,再回复当前线程的运行。

yield()  //让出CPU,当前线程进入就绪状态等待调度,并执行其它线程。

interrupt() //中断线程

wait()  //当前线程进入对象的wait pool

notify()/all //唤醒对象的wait pool中的一个或所有等待线程

四、sleep方法 Thread的静态方法

public static void sleep(long millis)throws InterruptedException //必须对异常进行捕捉

Thread.currentThread();  //得到当前线程

五、一种让线程退出的方式(interrupt方法)。

1 importjava.util.*;2 publicclassTestInterrupt{3 publicstaticvoidmain(String[] args){4 MyThread t=newMyThread();5 t.start();6 try{Thread.sleep(10000);}7 catch(InterruptedException i){}8 t.interrupt();9 }10 }11 12 classMyThreadextendsThread{13 publicvoidrun(){14 while(true){15 try{16 System.out.println("------"+newDate()+"-----");17 Thread.sleep(1000);//主线程sleep10秒结束将interrupt该线程的输出18 }catch(InterruptedException i){19 return;20 }21 }22 }23 }

六、join和yield方法

t.join(); //t的run()方法执行完才会继续执行当前线程方法体

t.yield(); //暂停当前正在执行的线程对象,并执行其他线程。方法为静态

1 publicclassTestYield {2 publicstaticvoidmain(String[] args) {3 MyThread3 t1=newMyThread3("t1");4 MyThread3 t2=newMyThread3("t2");5 t1.start(); t2.start();6 }7 }8 classMyThread3extendsThread {9 MyThread3(String s){super(s);}10 publicvoidrun(){11 for(inti=1;i<=100;i++){12 System.out.println(getName()+":"+i);13 if(i%10==0){14 yield();15 }16 }17 }18 }

注意:yield()只是使当前线程重新回到可执行状态,所以执行yield()的线程有可能在进入到可执行状态后马上又被执行。所以上面的程序不会实现2个线程交替每次输出10个数字!

七、线程优先级别

线程的优先级用数字表示,范围从1到10,一个线程的缺省优先级为5.

Thread.MAX_PRIORITY=1

Thread.MIN_PRIORITY=10

Thread.NORM_PRIORITY=5

例:t.setPriority(Thread.NORM_PRIORITY+3);

★八、线程同步

1.同步代码块

synchronized(this){  //在执行代码块过程中,不会被其他线程打断

...

}

public sunchronized void method //执行此方法时,当前对象被锁定

在Java语言中,引入了对象互斥锁的概念,保证共享数据操作的完整性,每个对象 都对应一个可称为"互斥锁"的标记,这个标记保证在任一时刻,只能有一个线程访 问该对象。

2.生产者、消费者model

1 /*@srchttp://eric-619.javaeye.com/blog/6936812 * 生产者消费者问题其含义就是先生产出了产品,才能拉出去让消费者购买3 * 一、重点:4 * 1、多个线程数据共享区域化思想!---源于多线程的近亲思想!!(类似于静态变量的改变)5 * (如栈内存和对内存,还有当做栈内存和堆内存,如数组和基本数据类型,只要是访问的同一个。)6 * 2、生产者消费者7 *8 * 二、synchronized加锁:9 *10 */11 12 13 publicclassProCon{//主方法14 15 publicstaticvoidmain(String[] args){16 SyncStack stack=newSyncStack();17 Consumer p=newConsumer(stack);18 Producer c=newProducer(stack);19 20 21 newThread(p).start();22 newThread(c).start();23 }24 }25 26 classProducerimplementsRunnable{//生产者27 privateSyncStack stack;28 29 publicProducer(SyncStack stack){30 this.stack=stack;31 }32 33 publicvoidrun(){34 for(inti=0; i

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值