java中的线程初步

来源:互联网 发布:人在德国上淘宝 编辑:程序博客网 时间:2024/06/10 08:01

  • 线程实现的两种方式
    • 继承Thread类
    • 实现Runnable接口
    • 推荐方式
  • 线程的操作方法
  • 线程同步的三种方法
    • 同步代码块
    • 同步方法
    • Lock
    • 死锁
    • 中断线程
  • 生产者和消费者应用案例

线程实现的两种方式

java中想要实现多线程操作,有两种方式

继承Thread类

继承Thread类后需要覆写其中的run()方法,表示该进程开始时运行run()方法中的内容。
在类实例化之后调用其start()方法就创建了一个线程。

注意:不是调用run()方法。而且调用start()方法后表示的是线程已经准备就绪,等待CPU执行。

如何获得当前线程的名字呢?
Thread.currentThread().getName();
返回的就是当前线程的名称。

实现Runnable接口

一个类实现Runnable接口后实现其中的run()方法。
然后在创建一个Thread对象,同时将Runnable对象作为参数传递给构造方法,这样创建出来的Thread对象再调用run()方法就可以实现线程的创建,同样的,注意同上,创建后仅仅是准备完毕,需要CPU来决定运行。

推荐方式

使用第二种方式,实现接口后可以把run()方法和线程类分开,而且还可以继承其他的类。

线程的操作方法

方法 作用 static Thread currentThread() 返回当前正在执行线程对象的引用 static void sleep(long mills) 休眠mulls毫秒后继续执行 void setPriority(int newPriority) 更改线程的优先级(仅仅是几率) static yield() 暂停当前的线程,让给其它线程

详细叙述一下sleep方法和yield()方法的区别。
在休眠的过程中,线程还在并且不会被其他线程“抢夺”,只是不工作了,在休眠结束后,再进行CPU的“抢夺”。
而yield()方法是表示该线程让出控制权,在这段时间内不进行工作,让给其它线程工作。

线程同步的三种方法

同步代码块

在代码块前由synchronized(mutex)修饰

synchronized(mutex){//同步内容}

其中mutex就是锁的概念,用任意对象都可以。
同时同步的代码应该尽量短,因为同步之后同步内容结束之前其他线程都无法执行。用性能来实现代码安全。

同步方法

在方法前用synchronized修饰,比如:

public synchronized void function {    //方法内容}

Lock

在JDK1.5后提供了这一功能,举例:

//互斥锁private final ReentrantLock lock = new ReetrantLock();public void function{    lock.lock();//上锁。    //方法内容    lock.unlock();//解锁。}

死锁

多线程中要进行资源的共享就需要同步代码,而同步的过多,就可能引起死锁,如何避免死锁,是很重要的一个问题。
下面先给出一个死锁的反例:

//现在有两个类 Customer(顾客)Waiter(服务员)class Customer{    public synchronized void say(Waiter w){        System.out.println("顾客说:先吃饭再买单。");        w.doService();    }    public synhronized void doService(){        System.out.println("同意,先吃饭吧。");    }}class Waiter{    public synchronized void say(Customer c){        System.out.println("服务员说:先买单再吃饭。");        w.doService();    }    public synhronized void doService(){        System.out.println("同意,先买单吧。");    }}//场景代码class DeadThread implements Runnable{    Customer c = new Customer();    Waiter w = new Waiter();    public DeadThread(){        new Thread(this).start();        w.say(c);    }    @Override    public void run(){        c.say(w);    }}

在自己的同步带吗中调用其它对象的同步代码,就会可能发生死锁。

中断线程

如果在一个线程执行过程中怎么样可以中断它呢?
可以在线程中设置一个标识,在线程运行时判断标识是否正确,可以在其他线程中改变这个标识,这样就可以中断线程的运行了。

生产者和消费者应用案例

0 0
原创粉丝点击