黑马程序员--java 多线程

来源:互联网 发布:网络搜索营销效果分析 编辑:程序博客网 时间:2024/04/29 04:26

---------------------- android培训、java培训、期待与您交流! ----------------------
什么是进程?
线程是线程,一个程序内部的一条执行线索,一程序中实现多段代码同时交替运行就需要产生多个线程。

创建新的线程:继承Thread并重写run方法,使用Thread创建的多个线程无法共享线程类的实例属性
class MyThread extends Thread
{
  public void run()
    {
    //代码部分
    }
}
public class ThreadCreate{
 
 public static void main(String[] args)
   {
       new MyThread().start();//调用start()方法来启动线程
   }
 
}

使用Runnable接口创建多线程:
    适合多个相同程序代码的线程去处理同一资源的情况,把虚拟cpu(线程)同程序的代码、数据有效分离,较好地体现了面向对象的设计思想。
   可以避免由于java的简单继承特性带来的局限。我们经常碰到这样的一种情况,即当我们要将已经继承了某一个类的子类放入多线程中,由于一个类不能同时有两个父类,所以不能用继承Thread类的方式,那么,这个类就只能采用实现Runnable接口的方式了。
    当线程被构造时,需要的代码和数据通过一个对象作为构造函数实参出传递过去,这个对象就是一个实现了Runnable接口的类的实例。
    几乎所有多线程应用都可用Runnable接口方式。
class TestThread extends Thread{
    public void run(){
           while(true){
                         // Thread.currentThread()返回线程执行类对象
                         System.out.println(“run(): ”+Thread.currentThread().getName());
                        }
                        }
                       }


 class Test{
           public static void main(String[] args){
                                             /*在启动之前(调用start()方法前)调用setDaemon(true)方法线程变为后台线程,只要有一个前台线程在运行,进程就不会结束,后台线程在执行,进程就会结束;pp.join()合并线程到调用该方法的语句中,成为单线程。*/
              new TestThread().start();//启动线程并调用Thread的run()方法
              while(true){
              
system.out.println(“main(): ”+Thread.currentThread().getName());
                         }
                         }
  }

Runnable中的run和Thread的run方法的区别
         (1). sonThread extends Thread{ public void run(){//}}
               new sonThread().start();
         (2).sonThread implment Runnable{ public void run(){//}}
               new Thread(new sonThreaad()).start();
       就Thread而言,对于100张票,new Thread().start();
         new Thread().start();
       这两线程各自独立的销售这100张票,可能会同时买同一张票.
       解决方法:sonThread tt=new sonThread();
                        tt.start();
                        tt.start();
       而就Runnable而言,sonThread tt=new sonThread();
                        new  Thread(tt).start();
                        new  Thread(tt).start();
       这两线程共同销售这100张票

线程的同步:
可用同步代码块:ynchronized(对象参数){}将代码包起来,使得在一段时间内,只允许一个线程进入。其参数可以为任一个对象,因为对象有一个标识位,可以作为监视器,当一个线程进入被监视的代码段,就会修改标识位,使得其他的线程无法进入,尽管此时cpu仍会切换线程,修改标识位的这个线程如同握有一把钥匙,只有它才能使用这段代码。只有修改标识位的这个线程恢复标识位,解锁监视器后,其他的线程才可进入。当一个线程在解锁监视器后,又可以再次进入,锁住这个监视器。要注为达到同步的目的,多个线程使用的监视器必须是相同的,即作为参数的那个对象,对于多个线程而言必须是相同的:
 
控制线程的方法
join线程:提供让一个线程等待另一个线呈的完成的方法:jion()方法.
后台线程DaemonThread:他是在后台运行的.
sleep:让当前正在执行的线程暂停一段时间,并进入阻塞状态.
yield() :让当前正在执行的线程,暂停但不进入阻塞而是进入就绪状态.

线程间的通信
wait:告诉当前线程放弃监视器并进入睡眠状态直到其他线程进入同一监视器并调用notify为止。
notify:用于唤醒同一对象监视器中调用wait的第一个线程。用于类似饭馆有一个空位后通知所有等候就餐的顾客中的第一位可以入座的情况。

notifyAll:用于唤醒同一对象监视器中调用wait的所有线程,具有最高优先级的线程首先被唤醒并执行。

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

原创粉丝点击