一、线程的基本概念:                        

线程是一个程序里面不同的执行路径。
程序里面不同的执行路径,每一个分支都是一个线程。
 
进程:静态的概念。机器上的一个class文件,机器上的一个exe文件,这叫一个进程。
机器里面实际上运行的都是线程。
window等。linux等都是多进程,多线程的系统。
 
CPU的执行是这样的:
CPU速度比较快,一秒钟算好几亿次,它把自己的时间分成一个一个的小时间片,这个时间片我执行你一会,再执行他一会,虽然有几十个线程,
没关系,执行这个一会,执行那个一会,挨着排的都执行一遍,但是对我们人来说,因为它速度太快了,你看起来就好像好多线程在同时执行一样。
但实际上,在一个时间点上, 这个CPU只有一个线程在运行。
如果机器是双CPU,或者是双核,那么确实是多线程。
 
二、线程的启动和创建:                                
 
例子1:实现Runnable接口:
package com.cy.thread;

public class TestThread1 {
public static void main(String[] args) {
Runner1 r = new Runner1();
Thread t = new Thread(r); //启动一个线程,线程启动必须调用Thread类的start()方法
//start方法会通知cpu,我现在有个新线程了啊,已经准备好了,您老人家什么时候有时间赶紧给我点时间片。
t.start(); for(int i=0; i<100; i++){
System.out.println("Main Thread:----- " + i);
}
}
} /**
* 实现了Runnable之后,jdk就知道了,这是一个线程类。
*/
class Runner1 implements Runnable{ @Override
public void run() {
for(int i=0; i<100; i++){
System.out.println("Runner1: " + i);
}
} }

console:

 
 例子2:继承Thread类:
package com.cy.thread;

public class TestThread1 {
public static void main(String[] args) {
Runner1 r = new Runner1();
r.start(); for(int i=0; i<100; i++){
System.out.println("Main Thread:----- " + i);
}
}
} class Runner1 extends Thread{ @Override
public void run() {
for(int i=0; i<100; i++){
System.out.println("Runner1: " + i);
}
} }
三、线程的状态转换:                                            
 

new Thread()一个线程之后,不会马上执行而是进入就绪状态,因为cpu很忙,可能正在执行其他程序;
等到cpu有空了,cpu分配时间片执行(调度)这个Thread一会;Thread进入运行状态;
当cpu分配给这个Thread的时间片用完了,或者其他原因故障等,Thread不再执行,阻塞,再次进入就绪状态;
直到这个Thread的程序执行完毕;终止。
 
四、线程控制的基本方法:                                          
isAlive():            判断线程是否还活着,即线程是否还未终止;就绪、运行、阻塞叫活着。终止了就死了。线程创建完还没启动那也是死的。
getPriority() 获得线程的优先级数值;优先级越高的线程获得的cpu执行的时间越多。
setPriority() 设置线程的优先级数值;
Thread.sleep() 将当前线程睡眠指定毫秒数。
join() 合并某个线程。
yield() 高风亮节,让出cpu,让其他的线程执行,而自己进入就绪状态。
wait() 当前线程进入对象的wait pool;
notify、notifyAll() 唤醒对象的wait pool中的一个/所有等待线程。

五、sleep方法:                                                

package com.cy.thread;

import java.util.Date;

public class TestInterrupt {
public static void main(String[] args) {
MyThread thread = new MyThread();
thread.start();
try {
/**
* 在哪个线程里面调用sleep方法,就让哪个线程睡眠。
*/
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
} /**
* interrupt()方法:thread线程在睡眠的时候,将它打断。
* 这里为了例子演示,让子线程结束。
* 但这不是让子线程结束的最好方法。
*/
thread.interrupt();
}
} class MyThread extends Thread{ @Override
public void run() {
while(true){
System.out.println("==="+new Date()+"===");
try {
sleep(1000);
} catch (InterruptedException e) {
return;
}
} }
}

console打印:

 上面的程序提供一个结束Mythread线程的方法:
/**
* 提供一个让线程结束的方法:
* thread.flag = false; run()方法就不再执行了,run方法一结束,线程就结束了。
*/
class MyThread2 extends Thread{ boolean flag = true; @Override
public void run() {
while(flag){
System.out.println("==="+new Date()+"===");
try {
sleep(1000);
} catch (InterruptedException e) {
return;
}
} }
}

六、join方法:                                                      

package com.cy.thread;

public class TestJoin {
public static void main(String[] args) {
MyThread2 t1 = new MyThread2("t1");
t1.start();
try {
/**
* 将t1线程合并到main线程,和main线程一块执行。
*/
t1.join();
} catch (InterruptedException e) {
e.printStackTrace();
} for(int i=0; i<=5; i++){
System.out.println("i am main thread");
}
}
} class MyThread2 extends Thread{
MyThread2(String s){
super(s);
} @Override
public void run() {
for(int i=0; i<=5; i++){
System.out.println("i am " + getName());
try{
sleep(1000);
}catch(InterruptedException e){
return;
}
}
} }

 七、yield方法:                                                
执行到某一个点的时候,让出CPU,其他的线程有机会执行,不要说老让我自己一个人占着;
但是我就让一下,不是说从此我就不再执行了;
package com.cy.thread;

public class TestYield {
public static void main(String[] args) {
//可以使用同一个线程类,new两个线程。
MyThread3 t1 = new MyThread3("t1");
MyThread3 t2 = new MyThread3("t2");
t1.start();
t2.start();
}
} class MyThread3 extends Thread{
MyThread3(String s){
super(s);
} @Override
public void run() {
for(int i=0; i<=100;i++){
System.out.println(getName() + ": " +i);
if(i%10 == 0){
yield();
}
}
}
}
观察输出,可以看到,每当被10整除后,下一个输出的一定是另外一个线程的。
 
八、线程的优先级:                                                
Java提供一个线程调度器来监控程序中启动后进入就绪状态的所有线程。
线程调度器按照线程的优先级决定应调度哪个线程来执行。
线程的优先级用数字表示,范围从1-10,一个线程默认的优先级是5;
Thread.MIN_PRIORITY = 1;
Thread.MAX_PRIORITY = 10;
Thread.NORM_PRIORITY = 5;
使用下述方法获得或设置线程对象的优先级:
int getPriority();
void setPriority(int newPriority);
package com.cy.thread;

public class TestPriority {
public static void main(String[] args) {
Thread t1 = new Thread(new T1());
Thread t2 = new Thread(new T2());
t1.setPriority(Thread.NORM_PRIORITY + 3);
t1.start();
t2.start();
}
} class T1 implements Runnable{ @Override
public void run() {
for(int i=0; i<1000; i++){
System.out.println("T1: " + i);
}
}
} class T2 implements Runnable{ @Override
public void run() {
for(int i=0; i<1000; i++){
System.out.println("----T2: " + i);
}
}
}
可以看到,t1得到cpu执行的时间片多,开始打印的都是t1,少部分t2。等到t1执行完了,才开始都是t2.
 
 
 
 
 
---------------

java多线程(1) 线程的基本概念的更多相关文章

  1. java多线程_01_线程的基本概念

    线程:一个程序里边不同的执行路径 例子程序:这个例子程序是一条执行路径.这个程序只有一个分支,就是main方法,叫主线程 public static void main(String[] args) ...

  2. Java多线程之线程的通信

    Java多线程之线程的通信 在总结多线程通信前先介绍一个概念:锁池.线程因为未拿到锁标记而发生的阻塞不同于前面五个基本状态中的阻塞,称为锁池.每个对象都有自己的锁池的空间,用于放置等待运行的线程.这些 ...

  3. Java多线程父子线程关系 多线程中篇(六)

    有的时候对于Java多线程,我们会听到“父线程.子线程”的概念. 严格的说,Java中不存在实质上的父子关系 没有方法可以获取一个线程的父线程,也没有方法可以获取一个线程所有的子线程 子线程的消亡与父 ...

  4. Java多线程02(线程安全、线程同步、等待唤醒机制)

    Java多线程2(线程安全.线程同步.等待唤醒机制.单例设计模式) 1.线程安全 如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程运行的结果是一样的,而且其他的变量 ...

  5. java多线程与线程间通信

    转自(http://blog.csdn.net/jerrying0203/article/details/45563947) 本文学习并总结java多线程与线程间通信的原理和方法,内容涉及java线程 ...

  6. java多线程之线程的同步与锁定(转)

    一.同步问题提出 线程的同步是为了防止多个线程访问一个数据对象时,对数据造成的破坏. 例如:两个线程ThreadA.ThreadB都操作同一个对象Foo对象,并修改Foo对象上的数据. publicc ...

  7. Java多线程与线程同步

    六.多线程,线程,同步 ①概念: 并行:指两个或多个在时间同一时刻发生(同时发生) 并发:指两个或多个事件在同一时间段内发生 具体概念: 在操作系统中,安装了多个程序,并发指的是在一段时间内宏观上有多 ...

  8. Java多线程之线程协作

    Java多线程之线程协作 一.前言 上一节提到,如果有一个线程正在运行synchronized 方法,那么其他线程就无法再运行这个方法了.这就是简单的互斥处理. 假如我们现在想执行更加精确的控制,而不 ...

  9. Java多线程| 01 | 线程概述

    Java多线程| 01 | 线程概述 线程相关概念 进程与线程 进程:进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是操作系统进行资源分配与调度的基本单位.可以把进程简单的理解 ...

  10. Java多线程之线程其他类

    Java多线程之线程其他类 实际编码中除了前面讲到的常用的类之外,还有几个其他类也有可能用得到,这里来统一整理一下: 1,Callable接口和Future接口 JDK1.5以后提供了上面这2个接口, ...

随机推荐

  1. ios 第2天

    类的方法和实例的方法 -(void)runwithspeed:(int)speed and direction:(int)direction; 实例方法 -开头 运用对象调用 函数名为runwiths ...

  2. 字符串-----KMP竟然是18禁

    今天学了一下午字符串,讲到结束也没讲KMP.有人问老师为什么不讲,老师来一句:字符串noip不考,而且还是18禁,自然不讲.[手动滑稽] 所以我也不讲.[微笑] 1.表达式树 表示3+5*8 最后计算 ...

  3. [AirFlow]AirFlow使用指南三 第一个DAG示例

    经过前两篇文章的简单介绍之后,我们安装了自己的AirFlow以及简单了解了DAG的定义文件.现在我们要实现自己的一个DAG. 1. 启动Web服务器 使用如下命令启用: airflow webserv ...

  4. String.prototype.getParm

    String.prototype.getParms=function(name){ var reg = new RegExp('(^|&)' + name + '=([^&]*)(&a ...

  5. BitArray编写埃拉托斯特尼筛法(原书错误,学习更正)

    刚开始代码无法运行,修改后原书代码可以运行了,可是书本的思想还是错的. 虽然接下来的都是讲错误的思想下的“错误”的修改. 原书缺了窗体控件的代码,虽然在VS下不需要手动写窗体的代码,但是刚开始确实也不 ...

  6. Swift 开源项目精选

    Swift 开源项目精选 站在个人的角度,并基于<Swift 语言指南>,针对开源项目做了一个甄别.筛选.当然,由于个人能力及涉足范围所限,还远远不够,其中肯定有偏颇及不足,还望同学们多多 ...

  7. 如何定位BAD_ACCESS

    1.访问了野指针,比如对一个已经释放的对象执行了release.访问已经释放对象的成员变量或者发消息. 死循环 如何调试BAD_ACCESS错误 1.重写object的respondsToSelect ...

  8. js之选项卡效果(淘宝侧边栏)

    HTML <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <ti ...

  9. 使用django搭建博客并部署

    2017/8/31 18:27:59 为了以后参考的方便,在这里总结一下django搭建博客网站的主要步骤.以下大部分的内容,参考自Django中文文档 - 看云. 需要强调的是,这里使用的djang ...

  10. TOF 初探

    TOF 简介 TOF是Time of flight的简写,直译为飞行时间的意思.所谓飞行时间法3D成像,是通过给目标连续发送光脉冲,然后用传感器接收从物体返回的光,通过探测光脉冲的飞行(往返)时间来得 ...