A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

操作系统和线程原理

线程是一个操作系统级别的概念。JAVA语言(包括其他编程语言)本身不创建线程;而是调用操作系统层提供的接口创建、控制、销毁线程实例。

  • 首先要说明的是,根据操作系统的不同(Windows/Unix/Linux/其他),他们所支持的线程底层实现和操作效果也是不尽相同的。不过一个操作系统支持的线程至少会有四种状态:就绪、执行、阻塞和终结。线程在四种状态下进行切换,都是要消耗不少的CPU计算能力的。

  • 并且根据操作系统使用线程的进程的不一样,线程还分为用户线程和操作系统线程。操作系统线程(内核线程),是指操作系统内核为了完成硬件接口层操作,由操作系统内核创建的线程:例如I/O操作的内核线程,这些线程应用程序是不能干预的;用户线程,是指用户安装/管理的应用程序,为执行某一种操作,而由这个应用程序创建的线程。后文我们讨论的JAVA线程,都是用户级线程。

  • 线程在创建时,操作系统不会为这个线程分配独立的资源(除了必要的数据支撑)。一个应用程序(进程)下的所有线程,都是共享这个应用程序(进程)中的资源,例如这个应用程序的CPU资源、I/O资源、内存资源。

  • 现在基本上主流操作系统都支持多线程实现。即一个应用程序中(一个进程中),可以创建多个线程。一个应用程序下,各个线程间都可以进行通讯、可以进行状态互操作。且一个进程中,至少有一个线程存在。


3、JAVA中最简单的线程示例

JAVA中提供了丰富的操作系统接口实现,帮助我们进行线程操作。这些实现分布在java的java.lang基础包、java.io基础包和java.util.concurrent工具包当中;这个专栏所涉及到的代码示例也会从易到难向大家进行演示。我们先来看看JAVA中最基本的线程操作实现(高手请绕行)。

3-1、Thread父类

java.lang.Thread类是JAVA中用于实现线程操作的最基本的类之一。您可以创建一个集成Thread类的子类来定义您自己的线程实现:


package test.thread.base;


import org.apache.commons.logging.Log;

import org.apache.commons.logging.LogFactory;

import org.apache.log4j.BasicConfigurator;


public class MyDefindThread extends Thread {


    static {

        BasicConfigurator.configure();

    }


    /**

     * 日志。一定要使用Log4j才行。否则你就用System.out吧

     */

    private static final Log LOGGER= LogFactory.getLog(MyDefindThread.class);


    /* (non-Javadoc)

     * @see java.lang.Thread#run()

     */

    @Override

    public void run() {

        Long threadId =  this.getId();

        MyDefindThread.LOGGER.info("线程(" + threadId + ")做了一些事情,然后结束了。");

    }


    public static void main(String[] args) throws Exception {

        new MyDefindThread().start();

    }

}

3-2、Runable接口


除了可以继承java.lang.Thread类来定义自己的线程外,您还可以实现java.lang.Runnable接口来定义一个线程(一般情况,我们优先使用这种方式):


package test.thread.base;


import org.apache.commons.logging.Log;

import org.apache.commons.logging.LogFactory;

import org.apache.log4j.BasicConfigurator;


public class MyDefindRunnable implements Runnable {


    static {

        BasicConfigurator.configure();

    }


    /**

     * 日志。一定要使用Log4j才行。否则你就用System.out吧

     */

    private static final Log LOGGER= LogFactory.getLog(MyDefindThread.class);


    /* (non-Javadoc)

     * @see java.lang.Runnable#run()

     */

    @Override

    public void run() {

        // 获取当前线程的ID

        long threadId = Thread.currentThread().getId();

        MyDefindRunnable.LOGGER.info("线程(" + threadId + ")做了一些事情,然后结束了。");

    }


    public static void main(String[] args) throws Exception {

        new Thread(new MyDefindRunnable()).start();

    }

}


以上的两段代码都没有太多可讲解的。您可以在调试环境下观察到JAVA应用程序是如何运行线程的:


4、下文介绍

下一篇文章中,我们将继续介绍Java所支持的线程间基本互操作,包括:阻塞、唤醒、终止等操作;然后介绍Java原生线程池的工作原理和基本操作。



0 个回复

您需要登录后才可以回帖 登录 | 加入黑马