线程是程序中的执行单元
多线程的目的:最大限度地利用CPU资源
举个例子:实际应用当中的多线程
开一个word程序一边打印word文档的内容,一边编辑word文档。
Java封装了一些类,这些类就可以实现多线程操作
创建线程的方式:
1.通过继承Thread类来创建线程
package cn.com.jlu.demo;
public class ThreadTest {
public static void main(String[] args) {
//创建一个线程,并命名为A
ThreadHello t1=new ThreadHello("A");
t1.start();//开启线程,Java虚拟机调用该线程的 run 方法。
//用线程类又创建了一个线程并命名为B
ThreadHello t2=new ThreadHello("B");
t2.start();
}
}
class ThreadHello extends Thread {
//创建一个还有name的构造方法,可以给线程定义名字,需要调用父类的含参构造方法进行初始化
ThreadHello(String name)
{
super(name);
}
//重写run(),具体的功能在里面实现
@Override
public void run() {
//super.run();
for(int i=0;i<5;i++)
{
System.out.println(this.getName()+"-"+i);
}
}
}
2.通过实现Runnable接口来创建线程,可以共享数据资源,例子:两个窗口买票
package cn.com.jlu.demo;
public class RunnableDemo {
/**
* @param args
*/
public static void main(String[] args) {
//Runnable接口实现类实例化
RunnableHello runHello=new RunnableHello();
//创建一个Thread类,将实现接口的实例化对象,作为参数,传递进去,两个线程类共同操作同一个对象,所以才能实现数据资源的共享,共同卖5张票
Thread t1=new Thread(runHello, "一号窗口");
t1.start();
Thread t2=new Thread(runHello, "二号窗口");
t2.start();
}
}
//使用Thread来实现上面的方法,不能实现数据资源的共享
class RunnableHello implements Runnable
{
private int ticket=5;
//实现runnable接口中的run方法,两个窗口买票,共卖5张票
@Override
public void run() {
while(true)
{
//由于Runnable接口中没有getName(),所以调用currentThread返回当前执行线程的对象引用
System.out.println(Thread.currentThread().getName()+":"+(ticket--));
if(ticket<1) break;
}
}
}
Runnable 接口的run()
实现多线程一般使用实现Runnable接口的方式,同继承Thread类相比有以下两点好处:
-避免单继承的局限,一个类可以实现多个接口,但是只能继承一个类
-适合资源的共享数据
Runnable接口的实现类对象不为空,则调用的是Runnable接口实现的run(),里面有四个参数,第二个参数就是接口的实现类对象
Runnable接口的实现类对象为空,则调用的是重写的Thread类的run()
线程的声明周期
线程的类型
setDaemon 有两种类型:守护线程(后台线程)或用户线程,当所有的用户线程结束了,守护线程也就结束了,JVM也就结束了。
-典型的守护线程:JVM中的垃圾回收器的线程