学习笔记 - Thread
一、线程简介
* 进程:是一个正在执行中的程序
* 每一个进程执行都有一个执行顺序。该顺序是一个执行路径,或者叫一个控制单元。
*
* 线程:就是进程中的一个独立的控制单元。
* 线程在控制着进程的执行。
*
* 一个进程中至少有一个线程
* @author Administrator
*
* java有两个进程:编译进程和运行进程
*
* Java VM 启动的时候会有一个进程java.exe
*
* 该进程中至少有一个线程负责java程序的执行。
* 而且这个线程运行的代码存在于main方法中
* 该线程称之为主线程
*
*扩展:其实更细的说明虚拟机:启动vm不止一个线程,还有负责垃圾回收机制的线程
*下载:多线程
*
*1.如何在自己的代码中自定义自己的线程
* java已经提供了对线程这类事物的描述,就是Thread类
*
* 创建线程的第一种方式,继承Thread
* 1. 继承Thread
* 2. 复写run方法
* 目的:将自定义的代码存储在run方法中,让线程运行。
* 3. 使该线程开始执行;Java 虚拟机调用该线程的 run 方法。
* 该方法两个作用:启动线程,调用run方法
*
* 每次运行结果都不同
* 因为多个线程都获取cpu的执行权。cup执行到谁,谁就执行
* 明确一点,在某一个时刻,只能有一个程序在运行。
* cpu在做着快速的切换,以达到看上去是同时运行的效果。
* 我们可以想象的把多线程在运行行为在互相强度cup的执行权
*
* 这就是多线程的一个特性:随机性,谁抢到执行谁,至于执行多长时间,cpu说了算
*
*为什么要覆盖run方法呢?
*
*Thread类用于描述线程。
*该类就定义了一个功能,用于存储线程要运行的代码。该存储功能就是run方法。
*
*也就是说Thread类中的run方法,用于存储线程要运行的代码。
二、线程初步使用示例
public class ThreadDemo {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Demo d = new Demo();
d.start();//开启线程并执行线程的run方法
//d.run();//仅仅是对象调用方法,而线程创建了,没有运行。
for(int i=0;i<60;i++)
System.out.println("你好---"+i);
}
}
//复写run,执行子类要执行的方法
class Demo extends Thread{
@Override
public void run() {
for(int i = 0;i<60;i++){
System.out.println("Demo run:"+i);
}
}
}
三、线程使用示例二
* 创建两个线程,和主线程交替运行
*
* 原来线程都有自己默认的名字
* Thread-编号 该编号从0开始
*
* static Thread currentThread():获取当前线程对象
*
* getName():获取线程名称
*
* 设置线程名称:setName或者构造函数 或者直接使用父类的构造函数直接传递名称
*
* 设置名称的意义:获取名称,判断当前运行的线程
public class ThreadDemo2 {
public static void main(String[] args) {
Test t1 = new Test("one");
Test t2 =new Test("two");
t1.start();
t2.start();
for(int i = 0;i<60;i++){
System.out.println("nihao:"+i);
}
}
}
class Test extends Thread
{
//private String name;
Test(String name){
//this.name = name;
//使用父类的构造方法,传递名字
super(name);
}
@Override
public void run() {
for(int i = 0;i<60;i++){
//System.out.println("name:"+name+"..."+i);
// System.out.println(Thread.currentThread().getName() == this.getName());
// System.out.println(this.getName()+"...."+i);
System.out.println(Thread.currentThread().getName() +"..."+i);
}
}
}
四、停止线程示例
* stop方法已经过时。
*
* 如何停止线程?
* 只有一种,run方法结束。
* 开启多线程运行,运行代码通常是循环结构。
*
* 只要控制住循环,就可以让run方法结束,也就是线程结束。
*
* 特殊情况
* 当线程处于冻结状态。
* 就不会读取到标记,那么线程就不会结束。
*
* 当没有指定的方式让冻结的线程恢复到运行状态时,这时需要对冻结进行清除。
* 强制让线程恢复到运行状态中来。这样就可以操作标记让线程结束。
public class StopThreadDemo {
public static void main(String[] args) {
StopThread s = new StopThread();
Thread t1 = new Thread(s);
Thread t2 = new Thread(s);
//Marks this thread as either a daemon thread or a user thread
t1.setDaemon(true);//设置为守护线程
t2.setDaemon(true);
t1.start();
t2.start();
int num = 0;
while(true){
if(num++ == 60)
{
//s.changFlag();
//没有下面两句话 让线程都处于等待状态
t1.interrupt();
t2.interrupt();
break;
}
System.out.println(Thread.currentThread().getName()+"......"+num);
}
}
}
class StopThread implements Runnable{
private boolean flag = true;
@Override
public synchronized void run() {
if(flag){
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
System.out.println(Thread.currentThread().getName()+"exception");
flag = false;
}
System.out.println(Thread.currentThread().getName()+"。。。。。。。。。。。run");
}
}
public void changFlag(){
flag = false;
}
}