1、进程与线程
进程:是一个正在执行的程序。每一个进程执行都有一个执行顺序,该顺序是一个执行路径,或者叫一个控制单元。
线程:就是进程中一个独立的控制单元。线程在控制着进程的执行。
特性:随机性。谁抢到谁执行,至于执行多长,cpu说了算。
一个进程中至少有一个线程。
2、创建线程方式
2.1、继承Thread类创建线程:
步骤:2.1.1、定义类继承Thread;
2.1.2、复写Thread类中的run方法;
2.1.3、调用线程的start方法,该方法两个作用:启动线程,调用run方法。
public class CreateXian extends Thread
{
static int i;
public void run()
{
for(i=0;i<10;i++)
{
System.out.println("......CreateXian.....");
}
}
}
public class Xian1
{
static int i;
public static void main(String[] args)
{
CreateXian x=new CreateXian();
x.start();
for(i=0;i<10;i++)
{
System.out.println("...main......");
}
}
}
2.2、实现Runable接口
步骤:2.2.1、定义类实现Runnable接口;
2.2.2、覆盖Runnable接口中的run方法;
2.2.3、通过Thread类建立线程对象;
2.2.4、将Runnable接口的子类对象作为实际参数传递给Thread类的构造函数;
因为,自定义的run方法所属的对象是Runnable接口的子类对象,所以要让线程去执行指定对象run方法,就必须明确run方法所属对象。
2.2.5、调用Thread类的start方法开启线程并调用Runnable接口子类的run方法。
public class RunanbleDemo implements Runnable
{
int i=100;
public void run()
{
while(true)
{
if(i>0)
{
//try{Thread.sleep(10);}catch(Exception e){}
System.out.println("...."+Thread.currentThread().getName()+"...."+i--);
}
}
}
}
public class Xian1
{
static int i;
public static void main(String[] args)
{
RunanbleDemo t=new RunanbleDemo();
Thread t1=new Thread(t);
Thread t2=new Thread(t);
t1.start();
t2.start();
for(i=0;i<5;i++)
{
System.out.println("...main......"+Thread.currentThread().getName());
}
}
}
运行结果如下:
从结果中可以看出,线程0和线程1交替运行,但是10后直接为8,最后又为9,其实这是错误的,下一篇博文介绍多线程的安全机制。
2.3、实现方式与继承方式区别
实现方式好处:避免了单继承的局限性。在定义线程时,建议使用实现方式。
继承Thread:线程代码存放在Thread子类的run方法中;
实现Runnable:线程代码存放在接口的子类run方法中。
3、获取线程对象及名称
线程都有自己默认的名称:Thread-编号,编号从0开始。
Thread类中的方法:
static Thread currentThread():获取当前线程对象(静态方法,返回值为Thread类型的类,因此其调用格式为Thread.currentThread())。
getName():获取线程名称。
setName:设置线程名称。