码迷,mamicode.com
首页 > 编程语言 > 详细

java多线程

时间:2018-08-13 00:41:31      阅读:161      评论:0      收藏:0      [点我收藏+]

标签:sch   bubuko   inter   strong   优先   ted   线程二   runnable   设计   

java多线程:

实现多线程的两种方式:

         1:继承Thread类,重写run方法:

 自定义Mythread类,继承Thread;

public class MyThread extends Thread {
    /*
     * 为什么要重写run();方法呢????
     * 因为run方法;里面封装的线程执行的代码;
     */
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println("开始");
            System.out.println(getName() + "---" + i);
        }
    }
}

 

测试以及多线程的常用方法:

   @Test
    public void test() throws InterruptedException {
        MyThread myThread = new MyThread();
        MyThread myThread2 = new MyThread();
        //设置线程的名字:
        myThread.setName("线程一");
        myThread2.setName("线程二");
     //获取当前线程的名字:
        String name = Thread.currentThread().getName();
       System.out.println(name);
      myThread.start();
      myThread2.start();
      /*
       *  start()与run()方法的区别:
       *  run()直接调用仅仅是普通方法,start()先加载进程,在加载run方法;
       */
        //设置线程的优先级;(级别:1-10级,级别越小,抢占到cpu时间片的时间越多!默认级别是:5)
        myThread.setPriority(10);
        myThread2.setPriority(1);
        //线程的休眠:
        myThread.sleep(1000);
        //线程的加入:
        myThread.join();//加入线程后,会先执行完该线程,在加载后面要执行的线程;
    }

 

 

2:实现Runnable接口,重写run方法:

public class MyThread2 implements Runnable {
    @Override
    public void run() {
        for(int i=0;i<100;i++){
            System.out.println(Thread.currentThread().getName()+"---"+i);
        }
    }
}

 

测试:

public class ThreadTest2 {
    @Test
   public void test(){
        MyThread2 myThread2 = new MyThread2();
        Thread thread = new Thread(myThread2);
        Thread thread2 = new Thread(myThread2);
        thread.start();
        thread2.start();
    }
}

 

这两种方法的区别:

    在实际开发中主要使用第二种,即实现Runnable接口,

        优势:1:解决了方式一中的单继承问题(即一个类继承了Thread后就不能继承其他类了),

                   2:适合多个相同程序去操作同一的资源的情况,把线程的代码和程序有效的进行数据分离,较好的体现了面向对象的设计思                               想。

 

4:多线程的常用方法:

            1 :  设置线程的名字:setName();

                    2: 获取线程的名字:getName();

                    3 :   获取当前线程对象再获取名字:Thread.CurrentThread.getName();

                4 :   线程的优先级:setPriority();    最小-----最大(1---10),默认是5级;

                5: 线程的礼让:   yield();      让多个线程执行得更加和谐,比如:线程1执行一次,线程2执行一次。。。。。但是也会出现问题;

                6 :  线程的休眠: sleep();     相当于让线程暂停一会儿,时间是毫秒;

                7 :  加入线程 :   join();        加入线程后会先执行完该线程,再执行其他的线程;

                8 :   中断线程:  stop();   或者  interrupt();  一般都使用interrupt();

                9 :   后台线程 :   setDaemon(true);  :   将该线程标记为守护线程或者用户线程,作用:当运行的线程都是守护线程时,虚拟机(JVM)会退出,停止执行。该方法必须在启动线程前调用。

 

5:线程的生命周期:

        技术分享图片

 

 

 6:线程的安全问题:

             eg:     卖票问题:

                          1:多个线程运行时,导致同一张票被卖了多次????

                                            CPU的操作必须是原子性的。

                           2:出现了负数票????

                                          由于线程的随机性和网络延迟导致的。

 

分析:出现线程安全问题的原因:

                  1:多线程环境            2:有数据的共享(在某个时间内线程都进行操作的数据)     3:有多条语句操作共享数据

 

7:线程安全问题的解决:

              1:同步代码块:

                        格式 : Syschronized  (对象)   {   需要同步的代码块

                                                                                                        }

 

                    同步代码块解决问题的根本原因就在 “对象”  上,如同锁的功能;

                  该对象可以是任意的对象;一般是定义一个成员变量:

                  //  创建锁:

               private  Object   obj    =   new   Object();   

                 把 obj  放入上面的(对象)中即可;

 

     同步的特点:前提是多线程;使用同一个锁对象(obj);

 

    同步的弊端:每个线程都回去判断同步上的锁,比较耗费资源,会降低程序的运行效率。

2:同步方法:

           把同步关键字加在方法上:eg:  public  Syschronized  void   ThreadTest(); 

            锁对象用this关键字表示;

    2-2 静态方法及所对象问题?

                 静态方法的锁对象:类的字节码文件对象(类 . class);

 

java多线程

标签:sch   bubuko   inter   strong   优先   ted   线程二   runnable   设计   

原文地址:https://www.cnblogs.com/dw3306/p/9465473.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!