初级必备:Java版本区别与了解_JavaSE_多线程1

    链接地址:http://www.xx566.com/detail/97.html

    首先我们需要了解进程和线程的概念,在操作系统中,进程是在某种程度上相互隔离,独立运行的程序。进程不只是程序代码,还包括当前活动,通过程序计数器的 值和处理器寄存器的内容来表示。进程通常还包括进程堆栈段(包括临时数据,如函数参数、返回地址和局部变量)和数据段(包括全局变量)。进程还可能包括堆 (heap),是在进程运行期间动态分配的内存。

    每个进程包含一到多个线程。线程是一组指令的集合,或者是程序的特殊段,它可以在程序里独立执行。也可以把它理解为代码运行的上下文。所以线程基本上是轻 量级的进程,它负责在单个程序里执行多任务。通常由操作系统负责多个线程的调度和执行。和进程一样,线程在程序中是独立的并发的执行路径,每个线程都有自 己的堆栈、程序计数器和局部变量。一个进程中的多个线程共享相同的内存地址空间,这意味着它们可以访问相同的变量和对象,而且从同一堆中分配对象。

    了解了进程和线程的概念,我们有必要来整理一下线程的生命周期。Java中线程的生命周期大体分为四种状态,任何一个线程都处于这四种状态之一:(详见百度百科

1、New Thread(新生态)

    产生一个Thread对象就生成一个新线程。当线程处于"新生态"时,仅仅是一个空的线程对象,它还没有分配到系统资源。因此只能启动或终止它。任何其他 操作都会引发异常。例如,一个线程调用了new方法之后,并在调用start方法之前的处于新线程状态,可以调用start和stop方法。

2、Runnable(可运行态)

    start()方法产生运行线程所必须的资源,调度线程执行,并且调用线程的run()方法。在这时线程的生命状态与周期线程处于可运行态。处于可运行态的线程,也有可能不在运行,这是因为存在线程优先级和CPU调度等因素。

3、Not Runnable(阻塞态)

    阻塞态是受迫态,只有当以下事件发生时才会产生:suspend()方法被调用;sleep()方法被调用;wait()方法被调用;线程处于I/O请求 的等待。线程处于阻塞态时,系统将不再对其进行排程,只有当线程的状态发生改变,重新回到可执行状态时,才有可能被重新执行。

4、Dead(死亡态)

    当run()方法返回,或别的线程调用stop()方法,线程进入死亡态,释放系统资源,等待JVM回收。

    在Java开发中,多线程的使用也随处可见,当一个Java程序启动后,JVM(Java虚拟机)会创建主线程,并在该线程中自动调用程序的main() 方法,同时JVM也会创建一些其他线程,如用于垃圾收集、垃圾回收的线程。Java语言本身也内置了线程支持,所有实现Runnable接口的类都可以通 过Thread.start()方法启动一个线程,线程启动会自动调用run()方法执行。不过run()方法的执行没有返回值,也不能抛出异常。

    Java对线程的内置支持是一把双刃剑,一方面简化了并发应用的开发,而另一方面,也为线程安全留下了隐患。因为在多线程开发中,多线程中各个操作的顺序 是不可预知的,如果没有充分的考虑同步,由此导致的意外结果也许会相当严重。在单一线程环境运行良好的程序,很可能在多线程环境中给你带来"惊喜"。

    为了确保多个线程访问同一数据项时(如静态字段、可全局访问对象的实例字段或共享集合),彼此之间对数据的访问互不干扰,Java语言提供了两个关键字Synchronized和volatile,用来确保同步。

    Synchronized关键字代表该方法加锁,它确保了一次只能有一个线程来执行代码的受保护部分,即确保了线程间的互斥,同时它也确保了一个线程更改的数据对其它线程的可见性,这样就保证了数据的原子性。

    volatile变量可以被看作是一种程度较轻的"Synchronized";与Synchronized块相比,volatile变量所需的编码较 少,并且运行时开销也较少,但是它所能实现的功能也仅是Synchronized的一部分,它适用于控制对基本变量(整数,布尔变量等)的单个实例的访 问,当一个变量被声明为volatile,任何对该变量的写操作,都会绕过高速缓存,直接写入主内存,对该变量的读操作,也直接读取主内存。这确保了任何 时候线程获取到的变量值都是相同的。使用 volatile 变量的主要原因是其简易性:在某些情形下,使用 volatile 变量要比使用相应的锁简单得多。使用 volatile 变量次要原因是其性能:某些情况下,volatile 变量同步机制的性能要优于锁。

    Java中多线程有两种实现方式:实现Runnable接口和继承Thread类,这两种方式的本质是一样的,Thread类实现了Runnable接口。简单示例如下:

package javase;
 
/**
 * 多线程
 * 
 * @Package javase
 * @ClassName: ThreadTest
 * @author Realfighter
 * @date 2014-7-8 下午01:32:01
 */
public class ThreadTest {
 
    public static void main(String[] args) {
        new ThreadByThread().start();
        new Thread(new ThreadByRunnable()).start();
    }
 
    /**
     * synchronized确保互斥,去掉synchronized试试看?
     * 
     * @Title: testSynchronized
     * @author Realfighter
     * @date 2014-7-8 下午04:25:48
     * @param name
     * @param i
     *            void
     */
    public static synchronized void testSynchronized(String name, int i) {
        for (int j = 0; j < 10; j++) {
            System.out.println(name + " print >>>>>>" + i * j);
        }
    }
 
    public static volatile int count = 0;
 
    /**
     * volatile确保数据同步
     * 
     * @Title: testVolatile
     * @author Realfighter
     * @date 2014-7-8 下午04:35:08
     * @param name
     * @param i
     *            void
     */
    public static void testVolatile(String name, int i) {
        for (int j = 0; j < 10; j++) {
            count++;
            System.out.println(count + " print >>>>>>" + i * j);
        }
    }
 
}
 
class ThreadByThread extends Thread {
    @Override
    public void run() {
        for (int i = 0; i < 50; i++) {
            // ThreadTest.testSynchronized(Thread.currentThread().getName(), i);
            ThreadTest.testVolatile(Thread.currentThread().getName(), i);
        }
    }
}
 
class ThreadByRunnable implements Runnable {
    public void run() {
        for (int i = 0; i < 50; i++) {
            // ThreadTest.testSynchronized(Thread.currentThread().getName(), i);
            ThreadTest.testVolatile(Thread.currentThread().getName(), i);
        }
    }
}

    不过多数情况下,我们希望new出来的线程在执行一定的操作后,返回给我们需要的结果,这时候简单的通过run()方法已经不能满足我们的需求了,于是 sun公司在Java 5中引入了一系列处理并发和多线程的功能类——Executor框架,其中包括线程 池,Executor,Executors,ExecutorService,CompletionService,Future,Callable等。 Executor允许你管理异步任务的执行,而无需显式的管理线程的生命周期,于是也成为了启动任务的优选方法。

    更多内容请点击:初级必备:Java版本区别与了解_JavaSE_多线程(2)

转载于:https://my.oschina.net/realfighter/blog/349700

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值