1.什么是线程

进程:

  • 一个正在运行的程序就叫一个进程。
  • 每个进程都有独立的内存空间。

(进程是资源分派的基本单位)

线程:

  • 一个进程中可以有很多线程。----> 常说的多线程
  • 线程没有独立的内存空间。

(线程是调度运行的基本单位)

2.线程的状态

线程分为五个阶段:

  • 创建new
  • 就绪runnable

线程对象调用了start()方法就进入了“可执行状态”。

  • 运行running

可执行状态的线程,获得了CPU权限,开始执行。(可执行状态是进入执行状态的唯一入口)

  • 阻塞blocked

线程因某种原因失去CPU使用权,暂停运行。

    • 等待阻塞:运行的线程执行了wait()方法。注意:wait()方法会释放持有的锁。
    • 同步阻塞:运行的线程在获取同步锁时,锁被别的线程占用。
    • 其他阻塞:运行的线程执行了sleep() / join()方法,或者发出了I/O请求。
  • 终止dead:执行完run()方法,或者因异常原因退出。


3.线程调度优先级

  • 优先级高的线程获得较多运行机会。
  • 优先级是int型,范围1~10。Thread类有下面三个静态常量:
    /**
* The minimum priority that a thread can have.
*/
public final static int MIN_PRIORITY = 1; /**
* The default priority that is assigned to a thread.
*/
public final static int NORM_PRIORITY = 5; /**
* The maximum priority that a thread can have.
*/
public final static int MAX_PRIORITY = 10;

Thread类中获得优先级,设置优先级---->getPriority(),setPriority()

4.创建线程

  • 实现Runnable接口
  • 继承Thread方法

实现Runnable接口(java.lang.Runnable)

class ThreadRunnable implements Runnable{
private Thread t; public void run() {
。。。
}
}

继承Thread方法(java.lang.Thread)

public class ThreadLearn {
public static void main(String[] args) {
MyThread m = new MyThread();
m.start();
}
} class MyThread extends Thread{
@Override
public void run() {
try {
System.out.println("进入睡眠状态");
Thread.currentThread().sleep(10000);
System.out.println("睡眠完毕");
} catch (InterruptedException e) {
System.out.println("得到中断异常");
}
System.out.println("run方法执行完毕");
}
}

区别:

Java单继承,多实现。因此,实现Runnable接口更利于资源共享。

5.常见函数说明

1 star()  调用该方法,可以使线程进入就绪状态,等待CPU分配资源

2 run()  就绪状态的线程,获得了CPU权限后,就开始执行run方法中的具体操作

3 Thread.currentThread()  获得当前线程

  Thread.currentThread().getName()  获得当前线程名称

  Thread.currentThread().getId()   获得线程的唯一标识

4 sleep()   让线程休眠一段时间,交出CPU权限,供其他线程使用。

  sleep不会释放锁。

  调用了sleep方法,必须捕获InterruptedException异常或者向上抛出异常。

5 yield()  与sleep()方法类似,交出CPU权限,让CPU执行其他线程;不会释放锁。

不同:

  • 不能控制交出CPU的时间。
  • 只能让拥有相同优先级的线程获得CPU执行机会。

注意:

  • 实际中无法保证yield()达到让步目的,因为让步的线程还有可能被线程调度程序再次选中。
  • yield()将导致线程从运行状态转到可运行状态。

6 isAlive()

public class MyThread01 {
private int i = 10;
public static void main(String[] args) {
MyThread01 mt = new MyThread01();
ThreadDemo1 thread01 = mt.new ThreadDemo1();
ThreadDemo1 thread02 = mt.new ThreadDemo1();
thread01.start();
thread02.start();
} class ThreadDemo1 extends Thread{
@Override
public void run(){
synchronized(this){
i++;
System.out.println("i:" + i);
try {
System.out.println("线程"+Thread.currentThread().getName()+"进入睡眠状态");
Thread.currentThread().sleep(10000);
} catch (InterruptedException e) {
System.out.println(e.getMessage());
}
System.out.println("线程"+Thread.currentThread().getName()+"睡眠结束,isAlive = "+Thread.currentThread().isAlive());
i++;
System.out.println("i:"+i);
}
}
}
}

运行结果:

i:11
线程Thread-0进入睡眠状态
i:12
线程Thread-1进入睡眠状态
线程Thread-0睡眠结束,isAlive = true
i:13
线程Thread-1睡眠结束,isAlive = true
i:14

必须等Thread-0结束之后,Thread-1才开始执行具体任务。

6 join()   一般,主线程创建并启动了子线程,如果子线程耗时较多,主线程往往早于子线程结束。如果主线程需要等待某个子线程的结果,等子线程结束之后再结束,则需要用到join()方法。

  • t.join()方法会使主线程进入等待池。
  • 等待t线程执行完毕之后,主线程才会被唤醒。
  • 不影响同一时刻处于运行状态的其他线程。
public class MyThread01 {

    public static void main(String[] args) {
ThreadDemo2 t1 = new ThreadDemo2("线程A");
t1.start();
for (int i = 0; i < 10; i++) {
if (i == 5) {
ThreadDemo2 th = new ThreadDemo2("joined thread");
th.start();
try {
th.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName() + " " + i);
}
} } class ThreadDemo2 extends Thread{
private String name; public ThreadDemo2(String name){
this.name = name;
} @Override
public void run(){
for(int i = 0; i < 5; i++){
System.out.println(name + " run test " + i);
}
}
}

运行结果:

main  0
main 1
main 2
main 3
main 4
线程A run test 0
线程A run test 1
线程A run test 2
线程A run test 3
线程A run test 4
joined thread run test 0
joined thread run test 1
joined thread run test 2
joined thread run test 3
joined thread run test 4
main 5
main 6
main 7
main 8
main 9

7 getName()和setName()  获得/设置线程名

8 getPriority()和setPriority()  获取/设置线程优先级

Java 线程学习笔记的更多相关文章

  1. Java线程学习笔记(两) 线程异常处理

    线程捕获异常: 情况下,我们在main()方法里是捕捉不到线程的异常的,比例如以下面代码: public class ExceptionThread implements Runnable{ @Ove ...

  2. Java线程学习笔记(一个)

    一个.正在创建的线程: 老掉牙的话题了.继承 java.lang.Thread父类或者实现Runnalbe接口.这里就提一句: class Thread implements Runnable Thr ...

  3. 学习java线程学习笔记

    线程:代码执行的一个分支          主要作用是提高了效率,cpu能同时执行多个部分的代码.      线程的创建:两种方式      a.继承于thread类,重写run方法.      b. ...

  4. Android(java)学习笔记267:Android线程池形态

    1. 线程池简介  多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力.     假设一个服务器完成一项任务所需时间为:T1 创建线程时间, ...

  5. Android(java)学习笔记211:Android线程池形态

    1. 线程池简介  多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力.     假设一个服务器完成一项任务所需时间为:T1 创建线程时间, ...

  6. 20145213《Java程序设计学习笔记》第六周学习总结

    20145213<Java程序设计学习笔记>第六周学习总结 说在前面的话 上篇博客中娄老师指出我因为数据结构基础薄弱,才导致对第九章内容浅尝遏止地认知.在这里我还要自我批评一下,其实我事后 ...

  7. [原创]java WEB学习笔记95:Hibernate 目录

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  8. java多线程学习笔记——详细

    一.线程类  1.新建状态(New):新创建了一个线程对象.        2.就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法.该状态的线程位于可运行线程池中, ...

  9. Android(java)学习笔记71:生产者和消费者之等待唤醒机制

    1. 首先我们根据梳理我们之前Android(java)学习笔记70中关于生产者和消费者程序思路: 2. 下面我们就要重点介绍这个等待唤醒机制: (1)第一步:还是先通过代码体现出等待唤醒机制 pac ...

随机推荐

  1. P1629八

    P1629八 Accepted 标签:[显示标签]     描述 八是个很有趣的数字啊.八=发,八八=爸爸,88=拜拜.当然最有趣的还是8用二进制表示是1000.怎么样,有趣吧.当然题目和这些都没有关 ...

  2. 第四十个知识点 一般来说SPA和DPA的区别是什么

    第四十个知识点 一般来说SPA和DPA的区别是什么 原文地址:http://bristolcrypto.blogspot.com/2015/07/52-things-number-40-what-is ...

  3. 「HAOI 2006」数字序列

    Description 给定一长度为 \(n\) 的数列 \(a\),可将 \(a_i\) 改为任意整数 \(k\),代价为 \(\mid a_i-k\mid\). 问最少改变多少个数能把它变成一个单 ...

  4. 一个老菜鸟的年度回忆 & 智能工厂奋斗的第三年,可能有你值得借鉴的

    岁月蹉跎,寒冬的夜晚仍伏案疾书,见论坛中有诸多大神已经开始了一年的总结,突然安奈不住心中的躁动,也想为这今年的奋斗留下只言片语,没有年初的目标总结,没有未来的展望,就想作为一篇日记记录今年项目精力,为 ...

  5. Capstone CS5218|CS5218参数|CS5218电路

    Capstone CS5218是一款单端口HDMI/DVI电平移位器/中继器,具有重新定时功能.它支持交流和直流耦合信号高达3.0-Gbps的操作与可编程均衡和抖动清洗.它包括2路双模DP电缆适配器寄 ...

  6. Nginx入门--从核心配置与动静分离开始

    写在前面 优化我们项目,服务器部署,不仅仅可以是分布式,Nginx一样可以通过动静分离,负载均衡来减轻我们服务器的压力.Nginx的知识链,学习周期相对比较长,博主也是刚刚入门,这篇就先从实现基础的动 ...

  7. golang 算法题 : 两数相加

    package mainimport "fmt"type ListNode struct { Val int Next *ListNode}func main() { l1 := ...

  8. PHP 中的回调函数

    回调函数就是在主进程执行过程中,满足某个条件后,跳转到预先设置好的函数中去执行的一种函数. 举例说明: 张三到一个水果店买苹果,刚好苹果卖完了,于是张三在店员那里留下了自己的电话,一个小时后店里有货了 ...

  9. mysql+heartbeat+drbd安装

    环境: 系统           IP地址            主机名             软件包列表 centos6.5  192.168.200.101      server1       ...

  10. CS基础 float 浮动的使用方法

    html代码: <body> <div class='red'> </div> <div class='green'> </div> < ...