zoukankan      html  css  js  c++  java
  • 线程实现方式。

    并发与并行:

    并发:多个任务交替执行 (一个人吃两个馒头,两个交替啃)

    并行:同时执行。(n个人吃n个馒头)  速度快些。

    线程与进程:

    进程:进入到内存中的程序叫进程。

    线程:

     主线程:

    执行主方法(main)的线程

    单线程程序:Java程序中只有一个线程,从main方法开始,从上到下依次执行。

    JVM执行main方法,main方法会进入栈内存,

    然后JVM找到操作系统开辟一条main方法通向cpu的执行路径,

    cpu就可以通过这个路径执行main方法,这个路径叫main(主)线程。

    多线程:

    java程序属于抢占式调度,哪个线程高,哪个线程就优先执行,同一级别随机执行。

    创建多线程程序的第一种方式:

    java.lang.Thread 类:是描述线程的类,想实现多线程程序,就必须继承该类。

    实现步骤: 

      1、创建Thread类的子类。

      2、子类重写run方法, 来设置线程任务。

      3、创建子类对象,调用start()方法,开启新的线程,执行run方法。

      结果是:两个线程并发执行。

    public class MyThread extends Thread {
        @Override
        public void run() {
            for (int i=0;i<3;i++){
                System.out.println("run->"+i);
            }
        }
    }
    public class ThreadDemo {
        public static void main(String[] args) {
            MyThread myThread=new MyThread();
            myThread.start();
            for (int i=0;i<3;i++){
                System.out.println("main->"+i);
            }
        main->0
        run->0
        main->1
        run->1
        main->2
        run->2 } }

    多线程运行原理:

    new MyThread的时候,又开辟了一条通向cpu的新路径,来执行run方法。

    此时,对cpu而言,就有了两条执行路径。

    main线程和新线程一起抢夺cpu的执行权。

    多线程内存分析:

    开始执行程序时,开辟一块栈内存,main方法入栈。

    此时,如果直接调用run方法的话,也是在这块栈内存执行run(),也就是仍然

    是main线程程序(单线程)程序。

    而如果调用的是start(),会另外开辟一块栈空间,run()入栈执行。

    Thread类的常用方法:

    获取线程名称:

      1、Thread类的方法,getName();

      2、获取当前正在执行的线程 static Thread currentThead(),然后用getName();

    第一种:

    public class MyThread extends Thread {
        @Override
        public void run() {
            System.out.println(getName());
            }
        }
    public static void main(String[] args) {
            new MyThread().start();
            new MyThread().start();
            //Thread-0
           // Thread-1
        }

    第二种:

    public static void main(String[] args) {
            System.out.println(Thread.currentThread().getName());
            //main
        }
    }

    设置线程名称:

      1、void setName(String name) 2、设置带参构造函数

    sleep方法:

      public static void sleep(Long ...) :使当前正在执行的线程以指定毫秒暂停。

     public static void main(String[] args) {
           for (int i=0;i<5;i++){
               System.out.println(i);
               try {
                   Thread.sleep(1000);
               } catch (InterruptedException e) {
                   e.printStackTrace();
               }
           }
        }

    创建多线程程序的第二种方式:

    实现Runnable接口:

    java.lang.Runnable.   实现类必须定义run的无参方法。

    java.lang.Thread 类的构造方法:

      1、Thread(Runnable target) 分配新的Thread对象。

      2、Thread(Runnable target,String name)。

    实现步骤:

      1、创建Runnable接口的实现类。

      2、重写run方法,设置线程任务。

      3、创建实现类的对象,用含有Runnable接口的构造函数创建Thread类对象。

      4、用start方法,开启新线程执行run();

    public class RunnableClass implements Runnable {
        @Override
        public void run() {
            for (int i=0;i<5;i++){
                System.out.println(
                        Thread.currentThread().getName()
                        +"->"+i
                );
            }
        }
    }
    public static void main(String[] args) {
           RunnableClass runnable=new RunnableClass();
           Thread thread=new Thread(runnable);
           thread.start();
           for (int i=0;i<5;i++){
               System.out.println(
                       Thread.currentThread().getName()
                       +"->"+i
               );
           }
        }

    两种实现多线程方法的区别:

    实现Runnable接口实现多线程的好处:

      1、避免单继承的局限性: 

        继承了Thread类就不能继承其他类了,而使用接口的方式还可以继承其他类。

      2、增强程序的扩展性,降低了程序的耦合性(解耦):

        用实现Runnable接口的方式,把设置线程任务和开启线程进行分离(解耦 )

    匿名内部类实现多线程:

    作用:

      简化代码,把实现类实现接口,重写方法,创建实现类方法统一完成。

    格式:  new 父类/接口(){重写方法};

     public static void main(String[] args) {
            new Thread() {
                @Override
                public void run() {
                    for (int i=0;i<5;i++){
                        System.out.println(currentThread().getName());
                    }
                }
            }.start();
           new Thread(new Runnable() {
               @Override
               public void run() {
                   for (int i=0;i<5;i++){
                       System.out.println(Thread.currentThread().getName());
                   }
               }
           }).start();
        }
  • 相关阅读:
    读Android之大话设计模式--前言和说明
    把二叉树打印成多行
    按之字形顺序打印二叉树
    对称的二叉树
    二叉树的下一个结点
    链表中环的入口结点
    字符流中第一个不重复的字符
    表示数值的字符串
    构建乘积数组
    数组中重复的数字
  • 原文地址:https://www.cnblogs.com/zhangyuhao/p/10770294.html
Copyright © 2011-2022 走看看