黑马程序员0902_多线程部分
来源:互联网 发布:美林数据 知乎 编辑:程序博客网 时间:2024/05/16 17:38
---------------------- android培训、java培训、期待与您交流! ----------------------
*在一个线程start()之前,调用setDaemon(true)后,这个线程就变成了后台线程。
*如果java中只剩下后台线程,这个进程就会结束。
*pp.join()的作用是把pp所对应的线程会并到调用pp.join();的语句的线程中
*将Runnable的类作为参数传给Thread,则Thread的run方法将调用Runnable的run方法
//实际编程极少使用继承thread类的方法,而用runnable的则更普遍,说实在的,我暂时还没想明白到底是为什么?
*用Runnable的类来模拟有四个售票口卖一辆火车的票的实例:
class ThreadDemo1
{
public static void main(String[] args)
{
TestThread tt = new TestThread();
new Thread(tt).start();
new Thread(tt).start();
new Thread(tt).start();
new Thread(tt).start();
}
}
class TestThread implements Runnable
{
int ticket=10;
public void run()
{
//int ticket=10;如果一不小心将初始值放在这儿,还是会卖出4套1-10的票
while(ticket>0)
{
System.out.println(Thread.currentThread().getName()+':'+ticket--);
}
}
}
输出结果不唯一,这是其中一个://用>1.txt这种命令可以将结果输出到一个txt文件中,便于自己查看结果
Thread-0:10
Thread-0:8
Thread-0:7
Thread-0:6
Thread-0:4
Thread-0:3
Thread-1:9
Thread-3:1
Thread-0:2
Thread-2:5
*throw+异常类的对象,再用try捕捉,从而实现匹配的catch(之前忘了--||)
*多线程在实际中的应用
1.网络聊天程序的收发
单线程:
开始
------------------|
| V
| 将键盘上读到的数据发送给对方
| |
| V
| 读取对方回送的数据加以处理
| |
|------------------
多线程将发送和读取分为两个独立的循环,从而一个步骤受到了阻塞,也不会影响另一个步骤的进行。
2.大型数据表记录的复制过程中的取消
将复制放在一个线程中,用户界面的取消按钮放在另一个线程中,则取消能够插入复制的过程中使复制停下来。
3.www服务器为每一个来访者都建立专线服务
<--多线程的同步问题-->
*多线程有时候会出现一个线程未完全执行完毕时,另一个线程已经开始,从而产生问题。
解决办法,在线程代码块外面加上synchronized代码块。
class ThreadDemo1
{
public static void main(String[] args)
{
TestThread tt = new TestThread();
new Thread(tt).start();//加了这句后,主线程main暂时被挂起,程序开始执行前面那句定的义被挂起的的线程
try{Thread.sleep(1);}catch(Exception e){}
tt.str="method";
new Thread(tt).start();
}
}
class TestThread implements Runnable
{
int ticket=10;
String str = new String();
public void run()
{ //int ticket=10;如果一不小心将初始值放在这儿,还是会卖出4套1-10的票
if (str.equals("method"))
{
synchronized(str)//加了这个语句块后,就保证线程的安全性,注意str的定义必须在run方法外,不然同步块无效,如果str改为this,则方法与代码块同步
{
while(ticket>0)
{
try{Thread.sleep(10);}catch(Exception e){}//如果只sleep(1)的话,还是会正常运行
System.out.println(Thread.currentThread().getName()+':'+ticket--);
}
}
}
else
{
while(ticket>0)
{
sale();
}
}
}
public synchronized void sale()
{
try{Thread.sleep(10);}catch(Exception e){}//如果只sleep(1)的话,还是会正常运行
System.out.println(Thread.currentThread().getName()+"-sale:"+ticket--);
}
}
同进程的线程共享一个内存块,所以通信容易。不同的进程因为处于不同的内存块,因此进程之间的通信相对困难。在Java程序中,JVM负责线程的调度。线程调度是值按照特定的机制为多个线程分配CPU的使用权。
调度的模式有两种:分时调度和抢占式调度。分时调度是所有线程轮流获得CPU使用权,并平均分配每个线程占用CPU的时间;抢占式调度是根据线程的优先级别来获取CPU的使用权。JVM的线程调度模式采用了抢占式模式。
---------------------- android培训、java培训、期待与您交流! ----------------------
- 黑马程序员0902_多线程部分
- 黑马程序员0904_多线程部分+API部分
- 黑马程序员_多线程
- 黑马程序员_多线程
- 黑马程序员_多线程
- 黑马程序员_多线程
- 黑马程序员_多线程
- 黑马程序员_多线程
- 黑马程序员_多线程
- 黑马程序员_多线程
- 黑马程序员_多线程
- 黑马程序员_多线程
- 黑马程序员_多线程
- 黑马程序员_多线程
- 黑马程序员_多线程
- 黑马程序员_多线程
- 黑马程序员_多线程
- 黑马程序员_多线程
- 教你如何去掉主机屋免费1G虚拟主机空间的广告
- perl open函数打开管道
- Jar命令行打包方法
- 64ubuntu 32 app
- js实现拖拽分页【转】
- 黑马程序员0902_多线程部分
- 音频采集(VC++ SDK实现)
- paramiko中的SSHClient对象的exec_command
- JavaScript图片放大技术
- JDK中没有Servlet包的解决方法
- 【dp】有向直线k中值问题
- 手机触摸屏的分类和原理,供大家选择手机时用
- 小谈一会儿
- 漫谈QWidget及其派生类(三)