• Java多线程(二)


    进程

    一个进程对应一个应用程序,在多进程环境下,各进程需要竞争CPU时间片来执行自己的指令。使用多进程的作用在于提高CPU的使用率,因为一般来说,CPU的频率是远高于内存读写速度的,多进程可以有效利用CPU的空闲时间。

    其次,多进程可以实现多个应用程序同时进行工作的服务。在单核时,在同一点上是只能运行一个进程;在多核时,可以在同一时间点上运行几个进程。但是,对于用户来说,只是运行速度的提升。

    进程与进程之间的内存是独立的。

    线程

    一个进程可以有多个线程,线程是进程中的一个执行场景。

    多线程作用不是为了提高执行速度,而是提高应用程序是使用率或者实现某些逻辑功能。

    线程和线程共享堆内存和方法区内存,栈内存是线程独立的。

    Java中的线程

    启动JVM,等于启动了一个应用程序即进程,该进程会自动启动一个主线程,然后主线程去调用某个类的main方法,所以main方法运行在主线程中。

    另外,我们可以由三种方法实现多线程:

    1、继承Thread类。

    2、实现Runnable接口。

    3、通过Callable和Future创建线程。(暂时不谈)

    Java是面向对象的编程语言,多线程的实现实际上就是创建几个线程对象,所谓线程对象,就是继承Thread类或者实现Runnable接口的类的实例对象。

    由Java API提供的Thread类内部已经写好了关于线程定义的代码,并提供了run()、start()、sleep()等方法由程序员进行重写或调用。Java编译器能够根据Thread类的源代码编译出相应的关于线程的指令,使得Java虚拟机又能够接收关于线程的字节码指令进而实现多线程效果。

    Thread类

    java的Thread类提供了关于Java线程的一些方法。

    1、public void start()

    使该线程开始执行;Java虚拟机调用该线程的run方法。

    2、public void run()

    如果该线程是使用独立的Runnable运行对象构造的,则调用Runnable对象的run方法;否则,该方法不执行任何操作并返回。

    3、public final void setName(String name)

    改变线程名称,使之与参数name相同

    4、public finall void setPriority(int priority)

    更改线程的优先级

    5、public final void setDaemon(boolean on)

    将该线程标记为守护线程或用户线程

    6、public final void join(long millisec)

    等待该线程终止的时间最长为millisec毫秒

    7、public void interrupt()

    中断线程

    8、public final boolean isAlive()

    测试线程是否处于活动状态

    (以下是静态Thread类的静态方法)

    1、public static void yield()

    暂停当前正在执行的线程对象,并执行其它线程

    2、public static void sleep(long millisec)

    在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。

    3、public static boolean holdsLock(Object x)

    当且仅当当前线程在指定的对象上保持监视器锁时,才返回true。

    4、public static Thread currentThread()

    返回对当前正在执行的线程对象的引用

    5、public static void dumpStack()

    将当前线程的堆栈跟踪打印至标准错误流

    继承Thread类实现多线程

    1、创建一个类ThreadClass,继承Thread类,获得了Thread中属性和方法。

    2、重写run方法,定义该线程要执行的动作。

    3、由子类ThreadClass创建对象threadObject。

    4、调用由Thread类定义的、ThreadClass由于继承也拥有的各种方法,实现线程的各种状态切换。

     实现Runnable接口实现多线程

    实际上,在Runnable接口里只定义了一个抽象方法run。而Thread类实现了Runnable接口,提供了start()方法等扩展。

    当我们实现Runnable接口后仅仅重写了run()方法是不会有多线程的,它跟我们普通接口是一样的。所以,还是要借助Thread类里定义的相关代码。

    这里有两个思路:

    思路一:

    1、创建一个类RunnableClass,实现Runnable接口。

    2、重写run方法,定义该线程要执行的动作。

    3、利用多态特性,创建一个Runnable对象ru,实例化为RunnableClass类。

    4、创建一个Thread类对象thread1,调用其构造方法new Thread(Runnable a)传入对象ru。

    5、由此,thred1的run()方法会被重写为Runnable类中重写的run()方法。调用由Thread类定义的的各种方法,实现线程的各种状态切换。

    思路二:

    1、创建一个类RunnableClass,实现Runnable接口。

    2、重写run方法,定义该线程要执行的动作。

    3、在该类中定义一个Thread类型的全局变量t,并调用构造方法new Thread(this)完成初始化。

    4、在该类中定义一个start()方法,调用t的start()方法。

    5、创建RunnableClass类的对象r1,调用start()方法。

    (思路二)解释:

    new Thread(this),this指的是由Runnable类创建的当前对象,该构造方法会对利用this.run()方法对t.run()方法进行重写。

    我们可以使用r1.t.start()的方式调用线程t的方法。但是为了安全,我们将变量t定义为私有属性,在RunnableClass类的start()方法中对其进行初始化和调用.start()方法。

    并提供sleep()方法调用线程t的sleep()方法等。

  • 相关阅读:
    Jqurey 得到url参数 getUrlParam
    JQUERY获取当前页面的URL信息
    TextView,imageView属性讲解
    滑动解锁
    显示界面跳转,隐式跳转
    代码进行Relativelayout,constraintLayout布局
    代码布局-LinearLayout
    实例xml拖拽详细方法布局
    layout布局
    AS资源了解
  • 原文地址:https://www.cnblogs.com/blunFan/p/11706374.html
Copyright © 2020-2023  润新知