CSDN博客地址

JAVA---多线程

java的线程是通过java.lang.Thread类来实现

VM启动时会有一个方法(public static void main(){})所定义的线程。

可以通过创建Thread的实例来创建新的线程。

每一个线程都是通过某个特定的Thread对象所对应的方法run()来完成其操作的,方法run()成为线程体。

通过调用Thread类中的start()方法来启动一个线程。

两种创建新线程的方式:

1:

定义线程实现Runnable接口

Thread  myThread=new Thread(target);  //target为Runnable接口类型

Runnable中只有一个方法:

public void  run()://用以定义线程运行体。使用Runnable接口可以为多个线程提供共享的数据。

在实现Runnable接口的类runn方法定义中可以使用Thread的静态方法:

public static Thread currentThread();获取当前线程的引用。

第二种:

可以定义一个Thread的子类并重写其run方法如:

class extends Thread{

          public void rMyThread run(){.....}

}

然后生成该类的对象:

MyThread myThread=new MyThread(....);

线程状态转换图:

方法/功能

isAlive();判断线程是否还“活“着,即线程是否还未终止。

getPriority();获取线程的优先级数值。

setPriority();设置线程的优先级数值

Thread.sleep();将当前线程睡眠指定毫秒数

join();调用某线程的方法,将当前线程与该线程合并,即等待该线程结束,再恢复当前线程的运营。

yield();让出CPu,当前线程进入就绪队列等待调度。

wait();当前线程进入对象的wait pool。

notify();唤醒对象的wait pool中的一个

notifyAll();所有等待线程

关键字synchronized来与对象的互斥锁联系。当某个对象synchronized修饰时,表明该对象在任一时刻只能由一个线程访问。

synchronize的使用方法:

synchronized(this){

num++;

try{Thread.sleep(1);}

catch(InterruptedException e){ }

System.out.println("name+",你是第"+num+"个使用timer的线程");

}

ynchronized还可以放在方法声明中,表示整个方法为同步方法:

sybchronized public void add(String name){....}

1:wait()与sleep()方法的区别:

相同点:都可以让线程进入等待状态;

不同点:wait()只能放在锁里面,而sleep()可以任意地方调用此方法;wait()方法可以释放锁,而sleep()不可以;

2:notify()方法:

只能放在锁里面;它唤醒是第一个等待的线程(当然有时也可任意)

3:wait() 与notify()方法的结合:

  一般步骤:

先建一个A类--》定义一个A类的对象a,然后把它当做B线程的构造方法形参,写run()方法,锁住对象a,给它一个wait()的方法,此时B线程处于等待状态,但锁被释放了。--》重复步骤2,在C线程的run方法中唤醒a,此时B线程后面的语句就可以输出。

A a=new A();

B b=new B(a);

C c=new C(a);

b.start();c.start();

5:注意事项:B线程和C线程那个先输出?为了避免其中一个线程后面的等待语句没有输出,最好用sleep()方法做一个先后。

4‘匿名类:

作用:节省代码量,方便,所提供的匿名类与匿名方法必须有关联,直接可以调用:

Thread t=new Thread(){

public void run(){

      .........代码......

                }

             };

t.start();

 

posted @ 2017-09-27 15:27  Yi_warmth  阅读(192)  评论(0编辑  收藏  举报
CSDN博客地址