一、线程的基本概念:                        

线程是一个程序里面不同的执行路径。
程序里面不同的执行路径,每一个分支都是一个线程。
 
进程:静态的概念。机器上的一个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. SpringMVC中的适配器

    适配器模式(Adapter):将一个类的接口转换成客户希望的另外一个接口,Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作 适用场景: 1.已经存在的类的接口不符合我们的需 ...

  2. (转)JAVA正则表达式语法大全

    [正则表达式]文本框输入内容控制 整数或者小数:^[0-9]+\.{0,1}[0-9]{0,2}$ 只能输入数字:"^[0-9]*$". 只能输入n位的数字:"^\d{n ...

  3. [置顶] 普通程序员如何入门AI

    毫无疑问,人工智能是目前整个互联网领域最火的行业,随着AlphaGo战胜世界围棋冠军,以及各种无人驾驶.智能家居项目的布道,人们已经意识到了AI就是下一个风口.当然,程序员是我见过对于新技术最敏感的一 ...

  4. 高德地图Demo运行报错 com.android.ide.common.process.ProcessException: Failed to execute aapt

    最近由于有需求去做导航方面的Android开发,很是无奈,以前也的确是没有搞过,领导开大会当着所有人的面说这是给我分配的第一个工作,无论如何要做好,突然间感觉压力好大,自己已经多年没有敲过代码,而且A ...

  5. IAuthenticationManager.SignOut 退不了

      AuthenticationManager.SignOut(); 这个退不了,然后就加上   AuthenticationManager.SignOut( DefaultAuthenticatio ...

  6. 让svn具有分布式的功能。

    最近开发遇到了个难事.公司的svn库不能随便提交,必须要经过验证.但是平时修改太多,如果不提交到svn说不定前面被删掉的代码后面又需要了.svn自带的relocate和switch都不能达到要求.找遍 ...

  7. 监听器(Listener)学习(二)

    一.监听域对象中属性的变更的监听器 域对象中属性的变更的事件监听器就是用来监听 ServletContext, HttpSession, HttpServletRequest 这三个对象中的属性变更信 ...

  8. BZOJ2687 交与并/BZOJ2369 区间【决策单调性优化DP】【分治】

    Description 对于一个区间集合 {A1,A2--Ak}(K>1,Ai不等于Aj(i不等于J),定义其权值 S=|A1∪A2∪--AK|*|A1∩A2--∩Ak| 即它们的交区间的长度乘 ...

  9. flask第十八篇——模板【2】

    请关注公众号:自动化测试实战 上一节我们介绍了模板的基本使用方法,现在我们想一个问题,如果把index.html放到template文件夹下面的文件夹该怎么办呢?其实很容易,当文件夹结构如下图所示时: ...

  10. DataBinder.Eval的正确使用

    本文介绍下,asp.net编程中有关DataBinder.Eval的用法,学习下asp.net DataBinder.Eval的用法,有需要的朋友参考下. 代码示例 :<%# Bind(&quo ...