黑马程序员--创建线程的两种方式、步骤以及代码体现
java中对线程这类事物进行了描述,即Thread类
方式一.继承Thread类
步骤:1.定义类继承Thread。
2.复写Thread类中的run()方法。
3.创建定义类对象调用线程的start()方法;此处start()方法有两个作用:启动线程和调用复写的run()方法。
举例如下:
class RunThread extends Thread//1.定义类继承Thread
{
private String name;
RunThread(String name)
{
super(name);
}
public void run()//2.复写Thread中的run()方法
{
for(int x=0;x<30;x++)
{
//打印线程名称有以下两种方法,第二种更常用
//System.out.println(this.getName()+" run ..."+x);
System.out.println(Thread.currentThread().getName()+" run ..."+x);
}
}
}
class ThreadDemo
{
public static void main(String[] args)
{
//3.创建定义类对象即创建了线程,并调用start()方法
RunThread rt1=new RunThread("线程1");
RunThread rt2=new RunThread("线程2");
rt1.start();
rt2.start();
for(int x=0;x<60;x++)
{
System.out.println("主线程 run ..."+x);
}
}
}
由于除了在接口之间允许多继承外,java只支持单继承,当定义的类有父类时若还想创建线程第一种方式失效
方式二:实现Runnable接口
步骤:1.定义类实现Runnable接口。
2.覆盖Runnable接口中的run()方法;注意将线程所要运行的代码放在run()方法中。
3.通过Thread类建立线程对象。
4.将Runnable接口的子类对象作为实际参数传给Thread类的构造函数。因为要让线程去执行指定对象的run()方法,就必须明确run()方法
的所属对象。
5.调用Thread类的start()方法开启线程并调用Runnable接口子类的run()方法。
举例如下:
class Bank
{
private int sum=0;
Object obj=new Object();
public void add(int n)
{
synchronized(obj)//此处为同步代码块,为避免多线程带来的安全问题而加
{
sum=sum+n;
System.out.println("sum= "+sum);
}
}
}
class Consumer implements Runnable //1.定义类实现Runnable接口
{
private Bank b=new Bank();
public void run()//2.覆盖Runnable接口中的run()方法
{
for(int x=0;x<3;x++)
{
b.add(100);
}
}
}
class TongbuDemo
{
public static void main(String[] args)
{
//3.通过Thread类建立线程对象;4.将Runnable接口的子类对象作为实际参数传给Thread类的构造函数
Consumer c=new Consumer();
Thread t1=new Thread(c);
Thread t2=new Thread(c);
//5.调用Thread类的start()方法
t1.start();
t2.start();
}
}
两种方式都可以创建线程,考虑到单继承的局限性,建议在定义线程时使用实现方式

浙公网安备 33010602011771号