黑马程序员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培训、期待与您交流! ----------------------

原创粉丝点击