java线程学习

来源:互联网 发布:论坛群发软件 编辑:程序博客网 时间:2024/05/17 05:03

  1.  线程是程序中的一条执行路径,即程序的运行流程。
  2.  多线程即程序中包含多条执行路径,指一个程序中可以同时运行多个程序块。多线程编程就是将程序任务分成几个并行的小任务,多个线程可以共享一块内存区域和资源。
  3. 线程的5个基本状态:创建状态;就绪状态;运行状态;阻塞状态;终止状态。
  4. 创建状态: 用new运算符创建Thread或者其子类的实例化对象,新线程即处于创建状态。例如:   new Thread(子类对象名).start();  new Thread(子类对象名).start();  就创建了两个线程。
  5. 就绪状态:调用start()方法,具有运行条件。即为线程分配系统资源,线程启动并进入就绪状态,进入线程队列排队,等待cpu服务,一旦获得CPU等资源,就可以脱离其主线程独立运行。
  6. 运行状态:run();
  7. 阻塞状态: 以下4种情况都是线程会进入阻塞状态。 阻塞时,线程不能进入排队队列,只有消除阻塞后才可以转入到就绪状态。
    • 调用sleep();
    • wait();
    • suspend();
    • 该线程正在等待I/O操作。
  8. 终止状态:stop(),destroy()方法。                 
  9. 创建线程的两种方式:
  • 继承Thread类。
    public class 类名称 extends Thread{//从Thread类扩展出子类public 类名称(){//子类的构造方法}public void run(){//重写Thread类里的run()方法。}public static void mian(String args[]){子类类名称 对象名=new 子类类名称();子类的对象.start();}}
  • 实现Runnable接口。
    //实现Runnabel接口创建线程的方式class ManyThread implements Runnable {//属性//方法public ManyThread(){//构造方法}public void run(){//线程的功能代码}public static void main(String[] args) {ManyThread rs=new ManyThread();Thread t=new Thread(rs);t.start();}}
    当Java想要继承某个类的同时创建多线程的时候,就需要用Runable接口创建线程了。    
  1. 进程与线程:进程:一个任务就是一个进程。操作系统中,进程被看做是系统资源的分配单位和独立运行的基本单位。一个进程中可以存在一个或者多个线程。  两者的区别在以下两个方面:
    • 同样作为基本的执行单元,线程是比进程更小的执行单位。
    • 每个进程都有一段专用的内存区域。一个进程崩溃后,在保护模式下不会对其它进程产生影响,线程是进程内部单一的一个顺序流。与此相反,线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,线程共享内存单元(包括代码和数据),通过共享的内存单元来实现数据交换、实时通信与不必要的同步操作。  
     
  2. 多线程同步代码块      同步是是各线程之间协调使用共享资源的以中共方式,如果一个对象(或者变量)同时被多个线程访问,那么这个对象必须使用线程同步。线程同步分同步代码块和同步方法两种。                                                                                                                                                                                                                                           同步代码块格式:
    synchronized(syncObject){      /**需要同步的代码;*/}
     同步代码块-例子:
    public class test {public static void main(String[] args) {//TextThread为实现Runnable接口的类,该类里有重写的run()方法。TextThread t=new TextThread();//开启了两个线程,new Thread(t).start();new Thread(t).start();}}class TextThread implements Runnable{private int num=3;public void run(){while(true){//由于两个线程访问的是同一个对象t,因此这个对象要线程同步,此处是线程同步代码块。synchronized (this){if(num>0){try{Thread.sleep(100);//线程休眠}catch(InterruptedException e){System.out.println(Thread.currentThread().getName()+"出错了!");}System.out.println(Thread.currentThread().getName()+"数字为:"+num--);}else {System.out.println(Thread.currentThread().getName()+"退出了");break;//如果num<0就退出循环。}}}}}
    上例,Thread-0执行结束后,Thread-1才可以访问同步代码块。                                                                                                                                                                                        多线程同步方法:当一个方法被关键字synchrozied声明后,就只允许一个线程来操作这个方法。即一次只能让一个线程运行。                                                                       格式如下:
    访问控制符 synchonized 返回值类型 方法名称(参数){     /**方法体*/}
    多线程同步方法例子:
    public class ThreadDemo {public static void main(String[] args) {ThreadTest1 t=new ThreadTest1();new Thread(t).start();new Thread(t).start();System.out.println(t.call());}}class ThreadTest1 implements Runnable{private int x;private int y;public synchronized void run(){for (int i=0;i<4;i++){x++;y++;try{Thread.sleep(100);}catch(InterruptedException e){System.out.println("The thread is wrong!");}System.out.println(Thread.currentThread().getName()+""+"x="+x+""+"y="+y+""+i);}}public synchronized String call(){String name=Thread.currentThread().getName();return "Hello"+name;}}
    运行结果:等应该共6种情况,可以看出每次只执行一个线程,且必须等这个线程结束才执行下一个线程。 
  3. wait()和notify()
  • wait():使线程处于等待状态,并且释放所持有对象的锁,要与notify()配套使用。每个java对象都有一个锁,任何时候该锁只能由一个线程控制。当wait()方法释放了该对象的锁时,进入等待池,一直要到线程调用该对象的notify()和notifyAll()方法,线程才可以进入可执行状态。
  • 唤醒一个等待状态的线程,是由JVM确定唤醒哪个(而非按优先级),自己并不能确切的唤醒某一个等待状态的线程。
  • notifyAll():唤醒所有处于等待的线程,而非给所有唤醒线程一个对象的锁,是让他们竞争,获得锁的线程即进入可执行状态。                                                                                                                                                                                                                                                                                                                                                                                                                                                                            

    

原创粉丝点击