----------------------
ASP.Net+Android+IOS开发、
.Net培训、期待与您交流! ----------------------
2 重写run()方法
3 调用对象的start()方法。
2 覆盖Runnable接口中的run方法。将线程要运行的代码放入run方法中。
3 通过Thread类建立线程对象。
4 将Runnable接口的子类对象作为实际参数传递给Thread类的构造函数。因为自定义的run方法所属的对象是 Runnable接口的子类对象。所以要让线程去执行指定对象的 run方法。就必须明确该run方法所属对象。
---------------------- ASP.Net+Android+IOS开发、 .Net培训、期待与您交流! ----------------------
创建线程的第一种方式,继承Thread类。
1 继承Thread类2 重写run()方法
3 调用对象的start()方法。
调用线程对象的start(),就开启了线程,运行线程的run()方法,同时。如果直接执行线程对象的run()方法,那就是普通的对象调用方法,没有开启线程,主线程中按顺序执行代码而已,还是单线程。
class Demo3 extends Thread{
private String name;
Demo3(String name){
this.name=name;
}
public void run(){
for(int i=0;i<=60;i++){
System.out.println(name+"Demo run--"+i);
}
}
}
public class ThreadDemo {
public static void main(String[]args){
Demo3 d=new Demo3("111111");
Demo3 a=new Demo3("222222");
d.start();
a.start();
for(int i=0;i<=60;i++){
System.out.println("Main run------"+i);
}
}
}
创建线程的第二种方式:实现Runable接口
1 定义类实现Runnable接口2 覆盖Runnable接口中的run方法。将线程要运行的代码放入run方法中。
3 通过Thread类建立线程对象。
4 将Runnable接口的子类对象作为实际参数传递给Thread类的构造函数。因为自定义的run方法所属的对象是 Runnable接口的子类对象。所以要让线程去执行指定对象的 run方法。就必须明确该run方法所属对象。
5 调用Thread类的start方法开启线程并调用Runnable接口子类的run方法。
下面用一个卖票的例子就能很清晰的看出二者的区别:
用Thread的:
class Ticket extends Thread{
static private int tick=100;
private String name;
public Ticket(String name){
this.name=name;
}
public void run(){
while(true){
if(tick>0){
System.out.println(name+" sale: "+tick--);
}
}
}
}
public class Maipiao {
public static void main(String []args){
Ticket t1=new Ticket("111");
Ticket t2=new Ticket("222");
Ticket t3=new Ticket("333");
Ticket t4=new Ticket("444");
t1.start();
t2.start();
t3.start();
t4.start();
}
}
因为ticket是静态的,所以4个线程类共享这100个资源。因为是继承的Thread,所以只能看到1个线程,从100执行到1,一共执行了100次,其余3个不执行。如果ticket不是静态的,那么4个线程都会不间断的执行100次。
用Runnable的:
class Ticket implements Runnable{
private int tick=100;
Object obj=new Object();
public void run(){
while(true){
synchronized(obj){
if(tick>0){
try{Thread.sleep(10);}catch(Exception e){}
System.out.println(Thread.currentThread().getName()+" sale: "+tick--);
}
}
}
}
}
public class Maipiao{
public static void main(String []args){
Ticket t=new Ticket();
Thread t1=new Thread(t);
Thread t2=new Thread(t);
Thread t3=new Thread(t);
t1.start();
t2.start();
t3.start();
}
}
因为是继承了Runnable,所以4个线程并发执行这100个资源。
实现方式的好处:避免了单继承的局限性。建议使用实现方式。
两种方式的区别:继承Thread:线程代码放在Thread子类run方法。实现runnable,线程代码存在接口的子类run方法中。---------------------- ASP.Net+Android+IOS开发、 .Net培训、期待与您交流! ----------------------