VVL1295

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

JAVA 线程基础

要创建一条线程,有两种方式:

1、实现Runnable接口;

2、继承Thread类;

第一种方式:实现Runnable接口,并实现run方法,然后以这个Runnable对象作为参数实例化Thread,然后调用start方法启动线程(要想启动线程必须实例化Thread对象,并调用start方法);

第二种方式:直接继承Thread类,重写run方法,实例化时可指定名字,然后调用start方法启动线程;

多线程操作中常用的方法:

1、getName,setName,获取线程的名字,设置线程的名字,注意,不要在线程启动后再设置线程的名字;

2、Thread.currentThread,获取当前的线程对象;

3、sleep,线程休眠,参数单位为毫秒;

4、wait,线程等待,待其他线程通过调用其notify或notifyAll方法才能将其唤醒;

5、isAlive,判断线程是否处于非死亡状态;

6、join,强行独占资源,线程占用全部资源,独自运行;

7、interrupt,把线程设置成中断状态,该操作仅仅把线程设置成中断状态(以后再详细补充);

同步:

被synchronized修饰的代码块和方法在一个时间段内只能被一个线程运行,避免了不同步时发生的错误;

死锁:

线程之间互相等待,进入死锁状态,都不能进行下去;

线程的生命周期:

创建,就绪,运行,阻塞,死亡;

程序实现解决生产者与消费者问题(该问题就是需要生产者每生产一次,消费者就消费一次,映射到多线程操作就是一个线程进行一次操作,另一个线程就进行一次操作):

package com.vv.test;

class Info {
    private String name = "李文宇";
    private String content = "钢琴教师";
    private boolean flag;
    public Info() {
        
    }
    
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public synchronized void set(String name,String content){
        if(!flag){
            try {
                super.wait();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        setName(name);
        setContent(content);
        flag = false;
        super.notify();
    }
    public synchronized void get(){
        if(flag){
            try {
                super.wait();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        System.out.println(getName()+"是"+getContent());
        flag = true;
        super.notify();
    }
}
class Producer implements Runnable {
    private Info info;
    private boolean flag = true;
    public Producer(Info info) {
        this.info = info;
    }
    @Override
    public void run() {
        for(int i = 0;i<50;i++){
            if(flag){
                info.set("梁维伟", "程序员");
                flag = false;
            } else {
                info.set("李文宇", "钢琴教师");
                flag = true;
            }
        }
        
        
    }
    
}
class Consumer implements Runnable {
    private Info info;
    public Consumer(Info info) {
        this.info = info;
    }
    @Override
    public void run() {
        for(int i = 0;i<50;i++){
            info.get();
        }
        
        
    }

    
    
}
public class TestProducerConsumer {

    public static void main(String[] args) {
        Info info = new Info();
        Producer producer = new Producer(info);
        Consumer consumer = new Consumer(info);
        Thread thread1 = new Thread(producer);
        Thread thread2 = new Thread(consumer);
        thread1.start();
        thread2.start();
    }

}

 

posted on 2015-09-24 14:55  bobo2018  阅读(121)  评论(0)    收藏  举报