黑马程序员_Java_多线程的创建

---------------------------------------------------- android培训、java培训、期待与您交流! ---------------------------




线程:一个正在执行的程序
一般情况下,程序中至少有两个线程在运行,一个是主函数的线程,另一个是垃圾回收线程

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
线程有四中状态1. 新状态:线程已被创建但尚未执行(start() 尚未被调用)。  
  2. 可执行状态:线程可以执行,虽然不一定正在执行。
 CPU 时间随时可能被分配给该线程,从而使得它执行。  
  3. 死亡状态:正常情况下 run() 返回使得线程死亡。
调用 stop()或 destroy() 亦有同样效果,
但是不被推荐,前者会产生异常,后者是强制终止,不会释放锁。  
  4. 阻塞状态:线程不会被分配 CPU 时间,无法执行。 


阻塞值得是暂停一个线程的执行以等待某个条件发生,
阻塞的方法有:1. sleep() 方法:sleep() 允许 指定以毫秒为单位的一段时间作为参数,
它使得线程在指定的时间内进入阻塞状态,不能得到CPU 时间,
指定的时间一过,线程重新进入可执行状态。  
典型地,sleep() 被用在等待某个资源就绪的情形:
测试发现条件不满足后,让线程阻塞一段时间后重新测试,直到条件满足为止。   
 2. suspend() 和 resume() 方法:两个方法配套使用,suspend()使得线程进入阻塞状态,并且不会自动恢复,
必须其对应的resume() 被调用,才能使得线程重新进入可执行状态。
典型地,suspend() 和 resume() 被用在等待另一个线程产生的结果的情形:
测试发现结果还没有产生后,让线程阻塞,另一个线程产生了结果后,
调用 resume() 使其恢复。   
 3. yield() 方法:yield() 使得线程放弃当前分得的 CPU 时间,但是不使线程阻塞,即线程仍处于可执行状态,
随时可能再次分得 CPU 时间。调用 yield() 的效果等价于调度程序认为该线程已执行了足够的时间从而转到另一个线程。     
     4. wait() 和 notify() 方法:两个方法配套使用,wait() 使得线程进入阻塞状态,它有两种形式,
一种允许 指定以毫秒为单位的一段时间作为参数,另一种没有参数,
前者当对应的 notify() 被调用或者超出指定时间时线程重新进入可执行状态,
后者则必须对应的 notify() 被调用。 (只用在synchronized中)
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

线程加入方法:jion()
Thread的非晶态方法jion()让一个线程B“加入”到另一个线程A的尾部,在A执行完毕之前,B不能工作;
例如:Thread t = new MyThread();
t.strat();
t.jion();
另外,jion()方法还带有超时限制的重载版本。例如:t.jion(5000);则让线程等待5000毫秒后运行,类似于sleep().


守护线程:守护线程与普通线程写法上基本么啥区别,调用线程对象的方法setDaemon(true),则可以将其设置为守护线程。
他是一类特殊的线程,当应用程序的非守护线程终止运行时,守护线程即使在运行,应用程序也会终止。一般守护
线程用于后台服务。
可以调用isDeamon()方法来判断一个线程是否为守护线程,也可以调用steDaemo()方法将一个线程设为守护线程。


线程的优先级设置:可以调用Thread类的方法getPriority()和stePriority()来存取线程的优先级
MAX_PRIORITY:10
MIN_PRIORITY:1
NOR:5


---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
创建线程一般有两种方式
方式一:继承Thread类,覆盖其run方法,调用线程的start方法
例如:public class MyThread extends Thread{
int count = 1,number;
public MyThread(int num){
number = num;
System.out.println("创建线程 " + number);  
}  

public void run() {     
while(true) {  
System.out.println("线程 " + number + ":计数 " + count);  
if(++count== 6) return;  
}  
}  


public static void main(String args[]) {  
for(int i = 0; i < 5; i++) 
new MyThread(i+1).start();    
}   

}


这种方法简单明了,符合大家的习惯,但是,它也有一个很大的缺点,
那就是如果我们的类已经从一个类继承(如小程序必须继承自 Applet 类),

则无法再继承 Thread 类!



方式二:实现Runnable接口,将线程的代码写入Runnable的run()方法中
例如:
public class MyThread implements Runnable {  
int count= 1, number;  
public MyThread(int num) {  
number = num;  
System.out.println("创建线程 " + number);  
}  


public void run() {  
while(true) {  
System.out.println("线程 " + number + ":计数 " + count);  
if(++count== 6) 
return;  
}   
}  


public static void main(String args[]) {  
for(int i = 0; i < 5; i++) 
new Thread(new MyThread(i+1)).start();  
}  d
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值