您的位置:首页 > 其它

线程基本概念

2014-10-01 17:11 225 查看
线程基本概念
一、概念:
①进程:是指正在执行中的程序,每一个进程都有一个执行顺序,该顺序是一个执行路径或者叫控制单元。
②线程:就是进程中的一个独立的控制单元,线程在控制着进程的执行。
注意:一个进程中最起码有一个线程

二、线程的两种定义方式
①方式一步骤:
I:定义类继承Thread
II:覆盖Thread类的run方法
III:创建Thread子类对象
IV:用Thread子类对象调用Thread类中的start方法

注意:thread类中run方法的两个作用:
1>、开启线程
2>、调用run方法

用法示例:

public class ThreadDemo {
public static void main(String[] args) {
//创建Thread子类对象
Thread1 first = new Thread1();
Thread1 secound = new Thread1();
//调用run方法
first.start();
secound.start();
}
}
//创建类继承Thread
class Thread1 extends Thread{
int piao = 100;

//覆盖父类run方法
public void run() {

while(piao>0){
try {
this.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(this.getName()+" is running"+piao);
piao--;
}
}
}


运行结果:
这时候,每次运行结果都不相同,因为多个线程都能获得CPU执行权,CPU执行到谁,谁就运行。但是在某一个时间点上,只有一个程序在运行(单核情况下),CPU在快速切换,以达到看上去是多个程序在同时运行。这里也可以理解为,多个线程在同时抢夺CPU执行权,这也是多线程的特点之一:随机性。谁抢到谁执行,执行多久,由CPU来决定。
覆盖run方法的原因:Thread用于描述线程,该类定义了一个功能,用于存储线程要运行的代码,该存储功能就是run方法。

②方法二步骤:
I:创建一个类实现Runnable接口
II:实现接口中的run方法
III:创建该类的对象
IV:创建Thread对象,并把Runnable子类对象作为参数传递给thread类构造方法
V:调用Thread对象的start方法开启线程。

用法示例:

public class ThreadDemo {
public static void main(String[] args) {
//实现的好处:可以避免单继承的局限性
//可以共享数据
//
/*
* 此时会出现买同一张票,是因为当first线程进入之后取到票的数量假如为98
* 在没有打印的时候,该线程失去执行权,second线程此时开始执行获得的票数也为98
* 此时任意一线程接着执行,就会出现卖出同一张票的情况
*
* MaiPiao t = new MaiPiao();
Thread first = new Thread(t, "first");
Thread secound = new Thread(t, "secound");
first.start();
secound.start();*/
//建立runnable子类对象
MaiPiao t = new MaiPiao();
//将runnable子类对象作为参数传递给Thread的构造函数
Thread first = new Thread(t, "one");
Thread secound = new Thread(t, "two");
//调用Thread的start方法开启线程
first.start();
secound.start();
}
}
//创建类实现Runable接口
class MaiPiao implements Runnable{

private int piao = 1000;
Object obj = new Object();
//覆盖接口中的run方法
public void run() {
while(true){
synchronized(obj){
if(piao>0){
try {
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+" is running"+piao--);
}
}
}
}
}


③:实现方式与继承方式的区别:
实现的方式避免了java单继承的局限性,因此在建立线程时建议使用实现的方式。

区别:
实现:线程代码存在于Runnable接口子类的run方法中
继承:线程代码存在于Thread子类的run方法中

三、线程的常见方法:
①:currentThread() 获取当前线程对象,返回值类型为Thread,此为静态方法
②:getName() 获取线程名称,返回值类型为String
③:setName()设置线程名称,返回值为空,(此方法也可在构造函数中实现)
④:interrupt()中断线程。
⑤:join()等待该线程终止
⑥:sleep()使线程休眠,可以传入以毫秒为单位的参数
⑦:start()开启线程

四:线程的几种状态与互相转化关系

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: