Java基础----线程

Java基础----线程

线程基础

1线程的创建方式
A、继承Thread类
B、实现Runnable接口(推荐使用)
    格式变化:可以采用匿名内部类方式创建线程
2相关方法
public Thread() //分配一个新的线程对象。

public Thread(String name) //分配一个指定名字的新的线程对象。

public Thread(Runnable target) //分配一个带有指定目标新的线程对象。

public Thread(Runnable target,String name) //分配一个带有指定目标新的线程对象并指定名字
3常用方法
public String getName() //获取当前线程名称。

public void start() //导致此线程开始执行; Java虚拟机调用此线程的run方法。

public void run() //此线程要执行的任务在此处定义代码。

public static void sleep(long millis) //使当前正在执行的线程以指定的毫秒数暂停(暂时停止执行)。

public static Thread currentThread() //返回对当前正在执行的线程对象的引用

线程安全

1安全问题
A、问题实例:
        售票问题

B、问题特征:
        多个线程、共享数据、修改数据(增删改)彼此影响

案例

//创建Runnable实现类
public class maipiao implements Runnable{
    int ticket=100;
    @Override
    public void run() {
        while(true){
        if(ticket>0){
     System.out.println(Thread.currentThread().getName()+"正在卖第"+ticket+"张票");
            ticket--;
        }
    }
    }
}
//测试类
public class test {
    public static void main(String[] args) {
        maipiao a=new maipiao();
        Thread t1=new Thread(a);
        Thread t2=new Thread(a);
        Thread t3=new Thread(a);
        t1.start();
        t2.start();
        t3.start();
        
    }
}
运行结果
//Thread-0正在卖第98张票
//Thread-0正在卖第97张票
//Thread-0正在卖第96张票
//Thread-2正在卖第100张票
//Thread-0正在卖第95张票
//Thread-1正在卖第100张票
//Thread-0正在卖第93张票
可以发现第100张票被卖了2次  这就是线程安全问题

2、解决方案
A、同步代码块
a. 格式:
    synchronize(锁对象){ .... }

b. 说明:
    非静态代码块锁对象是 this
    静态代码块锁对象是 类名称.class

案例

//创建Runnable实现类
public class maipiao implements Runnable {
    int take=200;
    @Override
    public void run() {
        while (true){
            try {
                Thread.sleep(30);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            method();
        }
    }
    private synchronized void method() {
        if(take>0){
            System.out.println(Thread.currentThread().getName()+"正在卖第"+take+"张票");
            take--;
        }
    }
}
//测试类
public class test {
    public static void main(String[] args) {
        maipiao a=new maipiao();
        Thread t1=new Thread(a);
        Thread t2=new Thread(a);
        Thread t3=new Thread(a);
        t1.start();
        t2.start();
        t3.start();
    }
}

B、同步方法
a. 格式:
    修饰符 synchronize 返回值类型 方法名称(参数列表){ ... }

b. 例如:
    public synchronize void method(){ .... }

案例

//创建Runnable实现类
public class maipiao implements Runnable {
    int ticket = 100;

    @Override
    public void run() {
        while (true) {
            method();
        }
    }
    public synchronized void method() {
        if (ticket > 0) {
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() + "正在卖第" + ticket + "张票");
            ticket--;
        }

    }
}
//测试类
public class test {
    public static void main(String[] args) {
        maipiao a=new maipiao();
        Thread t1=new Thread(a);
        Thread t2=new Thread(a);
        Thread t3=new Thread(a);
        t1.start();
        t2.start();
        t3.start();
     }
 }    

C、锁对象
a. 格式:
    Lock mlock = new ReentrantLock(); //【1】定义成员位置(获取锁对象)
    mlock.lock();       //【2】在数据变化前加锁(加锁)
    mlock.unlock();     //【3】在数据变化后解锁(解锁)

案例

public class Ticket implements Runnable{
    private int ticket = 100;

    Lock lock = new ReentrantLock();
    /*
     * 执行卖票操作
     */
    @Override
    public void run() {
        //每个窗口卖票的操作 
        //窗口 永远开启 
        while(true){
            lock.lock();
            if(ticket>0){//有票 可以卖
                //出票操作 
                //使用sleep模拟一下出票时间 
                try {
                    Thread.sleep(50);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                //获取当前线程对象的名字 
                String name = Thread.currentThread().getName();
                System.out.println(name+"正在卖:"+ticket--);
            }
            lock.unlock();
        }
    }
}
3、多线程的优缺点
多线程优缺点:
    优点: 效率高
    缺点: 安全性低 (数据安全性低)

加锁后的线程
    优点: 安全性高
    缺点: 效率低

线程状态

以汽车为例解释线程状态

a. New 新建(例如:刚刚买的新车,还未驾驶)
b. Runnable 可运行(例如:驾驶车)
c. Blocked 锁阻塞(例如: 走在路上,堵车了)
d. Waiting 无限等待(例如: 车子由于违停的情况,被交警拖走了,需要通知取车)
e. Timed Waiting 计时等待(例如: 车子走在路上,等待红绿灯,红灯倒计时结束)
f. Teminated 被终止(例如:车子使用完毕,卖出去了,销毁了)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值