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. .Net并行编程 - 并行任务基础知识

    在微软的.NET Framework中,任务是通过System.Threading.Tasks命令空间中的Task类来实现的.它的静态属性Task.Factory是TaskFactory类的一个实例, ...

  2. Linux下误删文件恢复办法

    恢复删除的文件 当误删除文件时,如果还有程序对此文件进行操作,那么可以通过lsof 命令恢复文件内容. 举例: 误删粗messages日志文件 [root@cdn ~]# cat /var/log/m ...

  3. angularJS遇到的坑

    最近在用angularjs做一些东西,由于学艺不精,对angularjs了解不够,导致经常会不小心掉进一些自己挖的坑里(⊙_⊙),在这里记下来,谨防又踩. 1.angularjs ng-show no ...

  4. Python中函数的参数-arguments

    归纳起来,Python中函数的定义形式和调用形式主要有如下几种形式: # 函数的定义形式 def func(name) # 匹配positional参数或者keyword参数 def func(nam ...

  5. 软件功能-东北师大站-第三次作业(PSP)

    1.本周PSP 2.本周进度条 3.本周累计进度图 代码累计折线图 博文字数累计折线图 本周PSP饼状图

  6. 扩展SplitContainer控件

    效果图: 自定义控件实现代码: using System; using System.ComponentModel; using System.Drawing; using System.Window ...

  7. 使用图片方式显示email地址

    import java.awt.Color; import java.awt.Font; import java.awt.FontMetrics; import java.awt.Graphics2D ...

  8. 【问题解决】Project facet Java version 1.7 (或者1.8)is not supported.

    在移植eclipse项目时,如果遇到 “Project facet Java version 1.7 is not supported.” 项目中的jdk1.7不支持.说明项目是其他版本jdk编译的, ...

  9. [剑指Offer] 50.数组中重复的数字

    题目描述 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度为 ...

  10. C# 利用FTP自动下载xml文件后利用 FileSystemWatcher 监控目录下文件变化并自动更新数据库

    using FtpLib; using System; using System.Collections.Generic; using System.ComponentModel; using Sys ...