zoukankan      html  css  js  c++  java
  • 线程的基本概念&线程的创建与启动

     如果要特别专业地去理解线程的话,这个可能要去看操作系统原理了,什么cpu的执行,怎么把一个进程调进来

    我们要理解的话,就————线程就是一个程序里面不同的执行路径。

    看个例子:

    每一个长方形都是个方法,黄色那个是main方法,右边那个是m1方法,再右边是m2,m3方法

    这么多方法,我们这个有几个线程呢?由红色的先可以看出,这个程序虽然有好几个方法,但程序的执行路径只有一条,也就是只有一个线程。

    像左下角那个图两条执行路径同时进行这样的就是多线程。每一个分支都叫一个线程

    也就是说我们现在学的只有一个分支,就是我们的main方法,这个叫主分支,也叫主线程,所以main方法叫做主线程。

    现在我们要说清楚进程这个概念。

    进程,只是一个静态的概念:机器上的一个class文件,机器上的一个exe文件。比如一个代码放进了代码区,放到了内存里面,它执行了吗?没有。说明一个进程已经准备开始了,进程已经产生了但还没有开始执行,我们平时说的进程的执行指的是进程里面的主线程即main方法开始执行了。 进程是个静态的概念,在机器里运行的都是线程。 一般现在的操作系统都是多进程,多线程的操作系统。

    其实cpu在一个时间点只能支持一个线程的执行,只是cpu的计算速度太快了,一秒几亿次,它把时间分成很多段,这一小段执行你这个线程,下个时间段执行下一个线程,但它速度太快了,所以对于我们来说就好像就好像多线程一样。  真正的多线程是多cpu或者多核。

    好滴现在我们怎么样才可以起一个新的路径呢?

    这个由java.lang.Thread这个类来搞定,new一个thread对象一个新的线程就实现了。

    然后什么run()方法运行,start()方法启动。

    run你要起一个新的线程你要有东西执行才行啊,你在run方法里面写什么东西它就执行什么东西。

    例子:

    我们搞了一个类,Runner1,实现了runnable接口,重写了run()方法。run里面就是你新线程要执行的内容。

    然后thread了一个新线程

    线程启动必须记住!一定要调用thread这个类的start()方法。它就是通知cpu现在有新线程了。

    当start()之后,这个程序就多了个执行路径,它们并行(交替)执行!我们可以从执行情况看出来

     但如果我们直接执行这个r的run()方法的话呢?

    这里就不再是多个线程多个分支了,而是简单的方法调用。

    输出结果是主线程的main方法那100个数输出完了之后再输runner1里面那个run方法的100个数。

    总之线程启动一定要调用thread这个类的start方法

    还有第二种启动线程的方法,就是继承Thread类

    public class TestThread1_2 {
        public static void main(String[] args) {
            Runner2 r2 = new Runner2();
            r2.start();
    
            for(int i = 0 ; i < 100 ; i++ ) {
                System.out.println("main thread :"+i);
            }
        }
    }
    
    class Runner2 extends Thread {//继承thread类
        public void run() {
            for(int i = 0 ; i < 100 ; i++ ) {
                System.out.println("Runner2 :"+i);
            }
        }
    }

    不过一般可以用接口就尽量用接口,因为继承你就只能继承一个类,接口你可以实现几个。所以尽量用接口。

  • 相关阅读:
    unity3d-----Collider 组件参考
    Activity使用Dialog样式导致点击空白处自动关闭的问题
    Android中fragment之间和Activity的传值、切换
    android获取屏幕宽高与获取控件宽高
    SQL表两列取一列唯一值的记录
    android addJavascriptInterface 不能生效 解决办法
    Android用ImageView显示本地和网上的图片
    调用webservice时,产生android.os.NetworkOnMainThreadException错误
    EditText输入小数
    ListView 删除item删除不了的问题解决办法
  • 原文地址:https://www.cnblogs.com/wangshen31/p/6830638.html
Copyright © 2011-2022 走看看