Java多线程编程核心技术(第一章笔记)

这几天一直在看《Java多线程编程核心技术》这本书,本文也是基于此书做的笔记。下面是相关的知识点和相关的代码。
1,进程的概念:
百度百科是这样讲进程的:进程是操作系统结构的基础,是一次程序的执
行;是一个程序及其数据在处理机上顺序执行所发生的活动;是程序在一个
数据集合上运行的过程;它是系统进行资源分配和调度的一个独立单位。
但是通俗的来讲,可以把操作系统中运行的.exe的程序理解为一个进程,进
程是受操作系统管理的基本运行单元。
2,线程的概念:在进程中独立运行的子任务。比如在QQ中可以边视频边和其
他人聊天。线程是异步的而不是顺序执行。之所以说线程不是顺序执行的,
是在启动多个线程的时候,并不是根据启动顺序去执行线程,而是随机的执
行。
3.Thread和Runnable的关系:Thread实现了Runnable接口,所以在自
定义线程的时候,可以实现Runnable接口或者是集成Thread类,不过接口
可以多实现,继承只能够单继承,这点的优缺点相信就不言而喻了。
4.多次调用Thread的start()方法会报
java.lang.IllegalThreadStateException异常,原因:线程的生命
周期是个不可循环的过程,一个线程对象结束了不能再次start。
5.synchronized:可以在任意对象及方法上加锁,而加锁的这段代码称
为“互斥区”或者是“临界区”。
6.currentThread()方法返回代码段正在被哪个线程调用的信息。
Thread.currentThread().getName()表示调用方法的线程名字,这
个方法和this.getName()是有区别的,如下例子:
package com.satx.test;

public class Test02 extends Thread{

    private int count = 5;

    @Override
     public void run(){
         super.run();
             System.out.println(this.getName());
System.out.println(this.currentThread().getName());          System.out.println(Thread.currentThread().getName());
     }

    public static void main(String[] args) {
        Test02 t = new Test02();
        Thread a = new Thread(t, "A");

        a.start();
    }
}

结果如下:
Thread-0
A
A

7.isAlive()方法:判断当前的线程是否处于活跃状态。
8.sleep()方法,在指定的毫秒数内让当前正在执行的线程休眠。
10.getId()取得线程的唯一标识:Thread.cerrentThread().getId();    
11.在Java中有三种办法可以停止线程:
(1)线程正常退出,也就是run方法执行完后。
(2)使用stop强行终止,不推荐,现在已经废弃,因为stop和suspend
和resume一样会产生不可预料的结果。
(3)使用interrupt方法中止线程,用之后不会立马停止线程,只是打了
个停止标。
12.判断线程是否是停止状态的两种方法:
(1)this.interrupted():测试当前线程是否已经中断,在调用完之后会
会清楚状态,比如用过interrupt方法之后,this.interrupt()之后调
用此方法,会返回true,再次调用此方法时会返回false。
(2)this.isInterrupted():测试线程是否已经中断,但是不会清除状
态。
13.当线程在活动之前或活动期间处于正在等待、休眠或占用状态且该线程
使用了interrupt会报InterruptedException异常。
14.调用stop()方法会抛出java.lang.ThreadDeath异常,在通常情
况下,该异常不用明显的捕捉。
15.suspend()暂停线程,resume(恢复线程),会造成独占线程。
一个有趣的例子:
public class Thread1 extends Thread{

    private long i = 0;
    @Override
    public void run() {
        // TODO Auto-generated method stub
        super.run();
        while(true){
            i++;
            System.out.println(i);
        }
    }

    public static void main(String[] args) throws InterruptedException {
        Thread1 t = new Thread1();
        t.start();
        Thread.sleep(1000);
        t.suspend();
        System.out.println("1");
    }
}
public class Thread1 extends Thread{

    private long i = 0;
    @Override
    public void run() {
        // TODO Auto-generated method stub
        super.run();
        while(true){
            i++;
            //System.out.println(i);
        }
    }

    public static void main(String[] args) throws InterruptedException {
        Thread1 t = new Thread1();
        t.start();
        Thread.sleep(1000);
        t.suspend();
        System.out.println("1");
    }
}
这两个程序运行的结果是不一样的,原因是print上也是有锁的,并未释放。
16.yield()方法:放弃当前的cpu资源,让它给其他的任务去占用cpu执
行时间,但放弃的时间不确定。
17.setPriority()该方法是为线程设置优先级,优先级为1-10,具有继
承性,所谓设置优先级,就是让更多的cpu去执行这个线程(规则性和随机
性)。大于1或者小于10,会抛出
java.lang.IllegalArgumentException异常。
18.守护线程:java中的两种线程,一种是用户线程,一种是守护线程。守
护线程最典型的应用就是GC垃圾回收机制。当进程中没有非守护线程了,则
垃圾回收机制也就没有存在的必要了,就自动销毁。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值