zoukankan      html  css  js  c++  java
  • java多线程注意事项

    1:继承thread和实现Runnable创建线程的区别:
     继承thread创建的对象直接start()就可以就绪,但是使用Runnable所new出来的对象要先new Thread(xx)才能start()
     这也就意味着在start()之前实现Runnable的类一次new 出来的对象是可以多次传入new Thread()创建多个线程实例并且多次start()的,就是说
     runnable的数据可以被共享,但是继承thread创建的线程不具备这个功能。

    class Thread1 extends Thread{  
        private int count=5;  
        private String name;  
        public Thread1(String name) {  
           this.name=name;  
        }  
        public void run() {  
            for (int i = 0; i < 5; i++) {  
                System.out.println(name + "运行  count= " + count--);  
                try {  
                    sleep((int) Math.random() * 10);  
                } catch (InterruptedException e) {  
                    e.printStackTrace();  
                }  
            }  
             
        }  
    }  
      
    public class Main {  
      
        public static void main(String[] args) {  
            Thread1 mTh1=new Thread1("A");  
            Thread1 mTh2=new Thread1("B");  
            mTh1.start();  
            mTh2.start();  
      
        }  
      
    }  

    2:线程的状态:

               |-阻塞- |
               |      |
        就绪-可运行-运行中-死亡
                |     / |
              |    /  |------等待

    运行---可运行:thread.yield()
    运行--等待:object.wait()
    运行--阻塞:thread.sleep() thread.join()
    运行--锁:synchronized
    等待--锁:object.notify() 或者wait时间到
    锁--可运行:

    3:解析sleep() wait() yield()的区别:

                    sleep                        wait                      yield
    所属类:        Thread                     Object                     Thread
    目的:            运行到阻塞                    运行到等待                  运行到可运行或者立即重新运行
    锁持有状态:    不释放                          释放                        释放
    让出cpu资源后:   允许比自己优先级低的运行                                 只允许比自己优先级高或等的执行,也可能自己去执行
    使用条件:        任何地方                     必须在同步块或者方法中 

    4:常用方法
       sleep(): 强迫一个线程睡眠N毫秒。
      isAlive(): 判断一个线程是否存活。
      join(): 等待线程终止。
      activeCount(): 程序中活跃的线程数。
      enumerate(): 枚举程序中的线程。
        currentThread(): 得到当前线程。
      isDaemon(): 一个线程是否为守护线程。
      setDaemon(): 设置一个线程为守护线程。(用户线程和守护线程的区别在于,是否等待主线程依赖于主线程结束而结束)
      setName(): 为线程设置一个名称。
      wait(): 强迫一个线程等待。
      notify(): 通知一个线程继续运行。
      setPriority(): 设置一个线程的优先级。

    5:synchronized

    a:    Public synchronized void methodAAA()//修饰静态方法时锁对象是调用这个方法的对象
        {
    
        //….
    
        }
    b:public void method3(SomeObject so)//修饰块时锁对象是括号中的对象
        {
            synchronized(so)
            {
           //…..
            }
        }
    c: Class Foo{
        public synchronized static void methodAAA()   // 同步的static 函数锁对象是当前类
        {
        }
        public void methodBBB()
    
        {
    
               synchronized(Foo.class)   // 等同于上面 
    
        }
    
           }

    6:经典例子

    public class Test {
        public  class myThread implements Runnable{
            private String threadName;
            private Object pre;
            private Object curr;
            public  myThread(String n,Object p,Object c){
                this.threadName=n;
                this.pre=p;
                this.curr=c;
            }
            public void run() {
                // TODO Auto-generated method stub
                int i=10;
                while (i>0){
                    synchronized(pre){
                        synchronized(curr){
                            System.out.println(threadName);
                            i--;
                            curr.notify();//通知下一个对象获得锁
                        }
                        try {
                            pre.wait();
                        }catch (InterruptedException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }//释放对pre对象持有的锁
                    }
                }
            }
        }
        public static void main(String[] args){
            Object a=new Object();
            Object b=new Object();
            Object c=new Object();
            Test t=new Test();
            myThread pa=t.new myThread("A",c,a);
            new Thread(pa).start();
            myThread pb=t.new myThread("B",a,b);
            new Thread(pb).start();
            myThread pc=t.new myThread("C",b,c);
            new Thread(pc).start();
        }
    }    
  • 相关阅读:
    java数组的相关方法
    spring boot 文件目录
    mysql 数据库安装,datagrip安装,datagrip连接数据库
    linux maven 的安装与配置
    java String字符串常量常用方法
    java 命名规范
    deepin 安装open jdk
    jetbrains(idea,webstorm,pycharm,datagrip)修改背景,主题,添加特效,汉化
    JVM学习(九)volatile应用
    JVM学习(八)指令重排序
  • 原文地址:https://www.cnblogs.com/zzy-frisrtblog/p/5834215.html
Copyright © 2011-2022 走看看