线程的基本使用
使用一个线程步骤:1、可以使用继承extends Thread;或者也可以使用实现Runnable方法,即implement Runnable;这两个都可以实现对线程的使用。但是由于继承只能有一个,实现方法可以无数个,所以建议使用implements Runnable这个方法(ps记得导入java.lang.*包)
例:
import java.lang.*;
....
....
class Cat extends Thread{
...
...
punlic void run(){
.....
}
}
或:
class Dog implements Runnable{
...
...
punlic void run(){
.....
}
}
2、不管你是继承还是实现Thread,都有重写run()这个方法
例:
public void run()
{
while(true){
try {
Thread.sleep(100);
} catch (Exception e) {
// TODO: handle exception
}
times++;
System.out.println("我是一个线程,正在输出第"+times+"个");
if(times==n){
break;
}
}
}
3、当然写好Thread这几个类后,也要创建Thread对象,并把刚刚写好的类的cat、dog对象匹配好。
例:
public class Demo_1 {
Cat cat=null;
Dog dog=null;
public Demo_1(){
cat=new Cat(10);
dog=new Dog(10);
//分别匹配两个线程
Thread t1=new Thread(cat);
Thread t2=new Thread(dog);
//对这两个线程开始
t1.start();
t2.start();
}
4.最后一步在主函数调用
以下是对线程的一点补充
1、线程对象只能启动一次
结论:不管是通过继承Thread,还是通过实现Runnable接口创建线程,它们的一个对象 只能启动(即:start())一次。否则就会有异常抛出。
2、java线程的同步
例:TicketWindows tw=new TicketWindows();
Thread t1=new Thread(tw);
Thread t2=new Thread(tw);
上面的代码是火车站售票窗口,t1,t2分别为 tw火车总部售票(tw一共有2000张票)。
if(num>0){
//显示售票信息
System.out.println(Thread.currentThread().getName()+"正在卖第"+num+"张票");
num--;
}
else{
break;//售票结束
}
在运行过程中有t1,t2同时售1999票的时候,不符合实际。
解决问题的关键就是要保证容易出问题代码的原子性,所谓原子性就是指:当a线程在执行某段代码的时候,别的线程必须等到a线程执行完后,它才能执行这段代码。就好像好多人上厕所排队上厕所一样,厕所只有一个马桶,得一个一个解决。
3、synchronized (this){
....
.....
}
锁的使用,在里面写try {....Thread.sleep(1000);.......}catch{....}等等,即可达到线程不同步。