资讯专栏INFORMATION COLUMN

Java 多线程编程核心技术1

hankkin / 2868人阅读

摘要:线程是在进程中独立运行的子任务。线程中断状态由该方法清除。测试线程对象是否已经是中断状态,但不清除状态标志。高优先级的线程总数大部分先执行完,但不代表高优先级的线程全部先执行完。当进程中不存在非守护线程了,则守护线程自动销毁。

进程是受操作系统管理的基本运行单元。

线程是在进程中独立运行的子任务。使用多任务操作系统Windows后,可以最大限度地利用CPU的空闲时间来处理其他的任务。使用多线程可以,提高CPU利用率,也就是使用异步,线程被调用的时机是随机的。

使用多线程技术时,代码的运行结果与代码执行顺序或调用是无关的。随机性。

Thread.java类中的start()方法通知“线程规划器”此线程已经准备就绪,等待调用线程对象的run()方法。执行start()方法发顺序不代表线程的启动的顺序。

共享数据的情况就是多个线程可以访问同一个变量,会出现线程不安全的问题。

synchronized可以在任意对象及方法上加锁,而加锁的这段代码称为“互斥区”或“临界区”。

非线程安全主要是指多个线程对同一个对象中的同一个实例变量进行操作时,会出现值被改变,值不同的情况。

虽然println()方法在内部是同步的,但i--的操作却是在进入println()之前发生的。

currentThread()方法可返回代码段正在被哪个线程调用的信息。

大多数停止一个线程的操作使用Thread.interrupt()方法,但这个方法不会终止一个正在运行的线程,需要加入一个判断才可以完成线程的停止。

this.interrupted()测试当前线程是否已经中断。当前线程是指运行this.interrupted()方法的线程。线程中断状态由该方法清除。

this.isInterrupted()测试线程是否已经中断。测试线程Thread对象是否已经是中断状态,但不清除状态标志。

能停止的线程——异常法

public class MyThread extends Thread{

    @Override
    public void run() {
        // TODO Auto-generated method stub
        super.run();
        try {
            for (int i = 0; i < 500000; i++) {
                if(this.isInterrupted()){
                    System.out.println("已经是停止状态了!我要退出");
                    throw new InterruptedException();
                }
                System.out.println("i="+(i+1));
            }
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    
}
public class Run {

    public static void main(String[] args) {
        try {
            MyThread myThread = new MyThread();
            myThread.start();
            Thread.sleep(2000);
            myThread.interrupt();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println("end");
    }
    
}

如果在sleep状态下停止某一线程,会进入catch语句,并且清除停止状态,使之变成false;

建议使用“抛异常”法来实现线程的停止,因为在catch块中可以对异常的信息进行相关的处理,而且使用异常流能更好,更方便地控制程序的运行流程,不至于代码中出现很多个return,造成污染。

在使用suspend与resume方法时,如果使用不当,极易造成公共的同步对象的独占,使得其他线程无法访问公共同步对象。也容易出现因为线程的暂停而导致数据不同步的情况。

yield()方法的作用是放弃当前的cpu资源,将它让给其他的任务去占用cpu执行时间。

高优先级的线程总数大部分先执行完,但不代表高优先级的线程全部先执行完。

当进程中不存在非守护线程了,则守护线程自动销毁。典型的守护线程就是垃圾回收线程。调用thread.setDaemon(true);设置守护线程。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/68062.html

相关文章

  • Java 线程编程核心技术6—单例模式与线程

    摘要:使用双检查机制来实现多线程环境中的延迟加载单例设计模式。类主要负责日期的转换与格式化,但在多线程环境中,使用此类容易造成数据转换及处理的不准确,因为类并不是线程安全的。 立即加载就是使用类的时候已经将对象创建完毕,常见的实现办法就是直接new实例化。而立即加载从中文的语境来看,有着急、急迫的含义,所以也称为饿汉模式。 package com.zxf.demo.singleton_0; ...

    TesterHome 评论0 收藏0
  • 线程编程完全指南

    摘要:在这个范围广大的并发技术领域当中多线程编程可以说是基础和核心,大多数抽象并发问题的构思与解决都是基于多线程模型来进行的。一般来说,多线程程序会面临三类问题正确性问题效率问题死锁问题。 多线程编程或者说范围更大的并发编程是一种非常复杂且容易出错的编程方式,但是我们为什么还要冒着风险艰辛地学习各种多线程编程技术、解决各种并发问题呢? 因为并发是整个分布式集群的基础,通过分布式集群不仅可以大...

    mengera88 评论0 收藏0
  • Java 线程编程核心技术5—定时器Timer

    摘要:如果执行任务的时间早于当前时间,则立即执行任务。其他任务不受影响。类中的方法作用是将任务队列中全部的任务进行清空。全部任务都被清除,并且进程被销毁。类中的方法有时并不一定会停止计划任务,而是正常执行。 Timer类的主要作用就是设置计划任务,但封装任务的类却是TimerTask类,执行计划任务的代码要放入TimerTask的子类中,因为TimerTask是一个抽象类。 创建1个Tim...

    hqman 评论0 收藏0
  • Java 线程编程核心技术4—Lock

    摘要:调用代码的线程就持有了对象监视器,其他线程只有等待锁被释放时再次争抢。使用多个对象,可以唤醒部分指定线程,有助于提升程序运行的效率。方法的作用是返回等待与此锁定相关给定条件的线程估计数。线程在等待时间到达前,可以被其他线程提前唤醒。 调用lock.lock()代码的线程就持有了对象监视器,其他线程只有等待锁被释放时再次争抢。效果和使用synchronized关键字一样,线程之间执行的...

    zhichangterry 评论0 收藏0

发表评论

0条评论

hankkin

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<