(一)
实现多线程有两种方式
(1)
继承Thread类,重写run()方法,如以下例子
class MyThread extends Thread{
public void run(){
//
}
}
class Main{
public void main(String[] args){
MyThread thread=new Mythread();
thread.start();
}
}
(2)
利用runnable接口实现,但是若只是定义了Runnable对象,如
public class Myobject
{
public static void main(String[] args)
{
//System.out.println("主线程" + Thread.currentThread().getName());
Runnable myRunnable = new Runnable()
{
@Override
public void run()
{
System.out.println(Thread.currentThread().getName());
}
};
}
}
Runnable对象必须依赖一个Thread类才能真正意义上说是另外开辟了一个线程,不然是默认在主线程中的,在Android更新UI有这种应用,利用runOnUiThread(runnable)来在主线程的某一块调用Runnable的run方法,此时并没有开辟另外的线程,而是在主线程中执行的,这一点应该分清楚。
真正意义上的开辟另外的线程看下面,需要Thread.start()来调用Runnable接口的run方法
class MyThread implements Runnable{
public void run(){
//
}
}
class Main{
public static void main(String[] args){
MyThread thread=new MyThread();//实例化runnable对象
Thread thread1=new Thread(thread);//通过Thread实例化runnable对象
thread1.start();//利用Thread线程类启动Runnable接口的run方法
}
}
(二)在利用Runnable进行多线程时,则有时候需要资源共享
当分配一个任务给多人时,假如要实现资源共享那么就用到
synchronized (this){
同步代码块
}
那我们就举个买票的例子
定义个ThreadTicket类
package MyThread;
public class ThreadTicket
{
public static void main(String[] args)
{
MyThread myThread1=new MyThread();
Thread t1 = new Thread(myThread1);//一窗口
Thread t2 = new Thread(myThread1);//二窗口
Thread t3 = new Thread(myThread1);//三窗口
t1.start();
t2.start();
t3.start();
}
}
此时的实现MyThread接口类
package MyThread;
public class MyThread implements Runnable
{
private int ticket = 10;
@Override
public void run()
{
//synchronized (this)
//{
for (int i = 0; i < 10; i++)
{
try
{
Thread.sleep(500);
} catch (InterruptedException e)
{
// TODO 自动生成的 catch 块
e.printStackTrace();
}
if (ticket > 0)
System.out.println("车票 :" + ticket--);
}
//}
}
}
由MyThread类可以得出此时的购票总数是10张票,分三个窗口买,那么此时就需要三个窗口共享票源,当没票时就不再进行售票
当不添加synchronized关键字时,此时显示的结果为
可以看到此时的结果是杂乱无章,完全没有达到资源共享
此时应该利用synchronized(this)
{
//code
}
同步代码块来实现资源共享
就是将MyThread的synchronized部分注释解除,此时的结果为
成功实现了资源共享的目的。
Runnable的很大的优点就在于资源共享。