start()

  start方法是Thread 类的方法,在这个方法中会调用native方法(start0())来启动线程,为该线程分配资源。

sleep()

  sleep方法有2个方法。

 public static native void sleep(long millis) 
throws InterruptedException;
public static void sleep(long millis, int nanos)
throws InterruptedException {
if (millis < 0) {
throw new IllegalArgumentException("timeout value is negative");
}
    if (nanos < 0 || nanos > 999999) {
        throw new IllegalArgumentException(
                            "nanosecond timeout value out of range");
    }

    if (nanos >= 500000 || (nanos != 0 && millis == 0)) {
        millis++;
    }

    sleep(millis);
}

  看了源码,发现第二个纳秒级别的没什么用,实际上还是毫秒级别。
  sleep方法在进入阻塞队列时不会释放当前线程所持有的锁。

yield()

  该方法会让当前线程交出cpu权限,但是不能确定具体时间,和sleep方法一样不会释放当前线程所持有的锁,该方法会让线程直接进入就绪状态,很好理解。目的是为了让同等优先级的线程获得cpu执行的机会。

join()

  该方法是让当前线程阻塞,直到调用该方法的线程执行完毕。源码分析

 public final synchronized void join(long millis)
throws InterruptedException {
long base = System.currentTimeMillis();
long now = 0;
    if (millis < 0) {
        throw new IllegalArgumentException("timeout value is negative");
    }

    if (millis == 0) {
        while (isAlive()) {
            wait(0);
        }
    } else {
        while (isAlive()) {
            long delay = millis - now;
            if (delay <= 0) {
                break;
            }
            wait(delay);
            now = System.currentTimeMillis() - base;
        }
    }
} 

  这个是join的源码,代码很清晰,如果调用该方法的对象线程已启动,那么当前线程释放该对象锁,并进入条件等待队列里面,等待改线程执行完(线程如果在同步代码块中结束会自动调用notifyAll()方法来唤醒等待队列里面的线程)

wait() ,notifyAll(),notify()

  这3个方法一般一同出现。且都是Object类的方法,用来辅助操作线程类。
  这3个方法都必须在同步代码块中,不然就会报错。
  wait()方法会让当前线程释放锁,并进入到条件等待队列。
  notify()方法会随机唤醒条件等待队列的任意一个线程,并将其放到锁池里面。
  notifyAll()方法则是唤醒条件等待队列的所有线程,并将其都放到锁池里面。
  而锁池里面的线程来竞争所需要的对象锁,成功获取到锁的线程将加入到就绪队列里面。

interrupt(),isInterrupted(),interrupted()

  这3个方法表示线程的中断,这个很有意思,分多钟情况讨论。(在java中,中断不是强制停止改线程,而是给线程一个信号,让其自行处理何时退出)
  isInterrupted:就是返回对应线程的中断标志位是否为true。
  interrupted:返回当前线程的中断标志位是否为true,但它还有一个重要的副作用,就是清空中断标志位,也就是说,连续两次调用
  interrupted(),第一次返回的结果为true,第二次一般就是false 。
  interrupt:表示中断对应的线程。

  中断线程分情况讨论:
  1.还没start,或者已经结束,无效果
  2.运行中,中断无效,直到只能设置个中断位,直到线程走完或者进入阻塞。
  3.锁池,中断无效。
  4.阻塞,等待,会抛出异常,可以中断。
  ps(io等待大多都是可以中断的,但是inputStream的read不会相应中断。)
  中断不好使,因此最好自己在线程类里面提供关闭方法。比如

 class MyThread extends Thread{
private volatile boolean isStop = false;
@Override
public void run() {
int i = 0;
while(!isStop){
i++;
}
}
    public void setStop(boolean stop){
        this.isStop = stop;
    }
}

总结

  在这里我没有写具体的例子,因为例子大家可以自己写测试下,太占篇幅了,这里只举出一些源码。

java线程的常用方法和属性介绍的更多相关文章

  1. java线程的常用方法

    java线程的常用方法 编号 方法 说明 1 public void start() 使该线程开始执行:Java 虚拟机调用该线程的 run 方法. 2 public void run() 如果该线程 ...

  2. Java之线程,常用方法,线程同步,死锁

    1, 线程的概念 进程与线程 进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1--n个线程.(进程是资源分配的最小单位) 线程:同一类线程共享代码和数据 ...

  3. java基础25 线程的常用方法、线程安全问题、死锁现象

    一.线程的常用方法 1.Thread(String name):初始化线程的名字2. setName(String name):设置线程的名字3. getName():返回线程的名字4. sleep( ...

  4. Java线程常用方法详解

    线程的常用方法 1.start() : 线程调用该方法将启动线程,使之从新建状态进入就绪队列排队,一旦轮到它来享用CPU资源时,就可以脱离创建它的线程独立开始自己的生命周期了. 2.run(): Th ...

  5. 【JAVA并发第二篇】Java线程的创建与运行,线程状态与常用方法

    1.线程的创建与运行 (1).继承或直接使用Thread类 继承Thread类创建线程: /** * 主类 */ public class ThreadTest { public static voi ...

  6. 获取Java线程转储的常用方法

    1. 线程转储简介 线程转储(Thread Dump)就是JVM中所有线程状态信息的一次快照. 线程转储一般使用文本格式, 可以将其保存到文本文件中, 然后人工查看和分析, 或者使用工具/API自动分 ...

  7. Java 线程创建与常用方法

    进程与线程 进程 程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至 CPU,数据加载至内存.在指令运行过程中还需要用到磁盘.网络等设备.进程就是用来加载指令.管理内存.管理 IO ...

  8. Java线程的概念

    1.      计算机系统 使用高速缓存来作为内存与处理器之间的缓冲,将运算需要用到的数据复制到缓存中,让计算能快速进行:当运算结束后再从缓存同步回内存之中,这样处理器就无需等待缓慢的内存读写了. 缓 ...

  9. java多线程的常用方法(以及注意事项)

    /* * 线程的常用方法 * 1.start(); * 2.run(); * 3.sleep(int millsecond); * 4.isAlive(); -->判断线程是否还在运行 * 5. ...

随机推荐

  1. scanf格式控制符的完整格式

    scanf格式控制的完整格式: %     *     m     l或h     格式字符 ①格式字符与printf函数中的使用方式相同,以%d.%o.%x.%c.%s.%f.%e,无%u格式.%g ...

  2. 二叉搜索树(BST)---python实现

    github:代码实现 本文算法均使用python3实现 1. 二叉搜索树定义   二叉搜索树(Binary Search Tree),又名二叉排序树(Binary Sort Tree).   二叉搜 ...

  3. LintCode-41.最大子数组

    最大子数组 给定一个整数数组,找到一个具有最大和的子数组,返回其最大和. 注意事项 子数组最少包含一个数 样例 给出数组[−2,2,−3,4,−1,2,1,−5,3],符合要求的子数组为[4,−1,2 ...

  4. iOS开发GCD的简单使用

    - (void)viewDidLoad { [super viewDidLoad]; // gcd 可以充分调用设备的 cpu 发挥最大性能,在 C 语言基础之上封装的 // dispatch_que ...

  5. DataSet和List 泛型之间互相转换 (转载)

    //DataSet与泛型集合间的互相转换 //利用反射机制将DataTable的字段与自定义类型的公开属性互相赋值. //注意:从DataSet到IList<T>的转换,自定义类型的公开属 ...

  6. Qt-排序

    1.要求传入起始指针,总长度,单元素空间占用大小(sizeof(A[i])),判断函数. 判断函数参数类型为const void *,使用需要在函数内自行转换为对应类型, 返回值为整数型,升序排序时正 ...

  7. jdbc关闭连接顺序

    jdbc连接数据库时,先获取connection,再通过statement进行操作,将结果集放在resultset中,不过在关闭数据库的时候要小心,要跟前面的操作反着来,不然就会出现异常.如果直接关闭 ...

  8. matlab中滤波函数

    matlab自带滤波器函数小结(图像处理)   1 线性平滑滤波器 用MATLAB实现领域平均法抑制噪声程序: I=imread(' c4.jpg '); subplot(231) imshow(I) ...

  9. 51nod 1304 字符串的相似度(exkmp)

    拓展kmp裸题 自己跟自己匹配即可 模板测试=v= #include <iostream> #include <cstring> using namespace std; ; ...

  10. monitor_guiagent

    monitor_guiagent monitor_guiagent.sh #!/usr/bin/env bash #filename : monitor_guiagent.sh #Usage: /us ...