多线程

一、进程概念:正在执行的程序

二、线程概念:线程是进程的控制单元,一个进程中可能会有多个线程

        单线程:在同一时间段只能够执行一个任务

         多线程:在同一时间段可以有多个任务同时执行

三、实现线程的两种方式

  1. 继承Thread 类   

        第一步:书写一个普通类,让此类继承Thread

        第二步:重写Thread类中的run方法,run方法中存放任务代码



package cn.java.thread;

/**
 * Description: 任务一 <br/>
 * Date: 上午8:51:19 <br/>
 * 
 * @author zkl
 * @version
 * @see
 */
public class Task1 extends Thread {

    @Override
    public void run() {// 存放任务代码
        for (int i = 1; i <= 1000; i++) {
            System.out.println("Task1..............i=" + i);
        }
    }

}

package cn.java.thread;

/**
 * Description: <br/>
 * Date: 上午8:51:44 <br/>
 * 
 * @author zkl
 * @version
 * @see
 */
public class Task2 extends Thread {

    @Override
    public void run() {
        for (int j = 1; j <= 1000; j++) {
            System.out.println("Task2..............j=" + j);
        }
    }

}
/**
 * Project Name:dt55_chapter22
 * File Name:Window.java
 * Package Name:cn.java.thread
 * Date:上午8:58:21
 * Copyright (c) 2017, bluemobi All Rights Reserved.
 *
*/

package cn.java.thread;

/**
 * Description: <br/>
 * Date: 上午8:58:21 <br/>
 * 
 * @author dingP
 * @version
 * @see
 */
public class Window {

    public static void main(String[] args) {
        Task1 task1 = new Task1();// 任务一
        Task2 task2 = new Task2();// 任务二

        task1.start();
        task2.start();
        // task1.run();
        // task2.run();
    }

}

     2. 实现Runnable接口

         第一步:书写一个普通的任务类,让此类实现Runnable接口

         第二步:实现Runnable接口中的run方法,存放任务

/**
 * Project Name:dt55_chapter22
 * File Name:Task1.java
 * Package Name:cn.java.runnable
 * Date:上午9:41:10
 * Copyright (c) 2017, bluemobi All Rights Reserved.
 *
*/

package cn.java.runnable;

/**
 * Description: <br/>
 * Date: 上午9:41:10 <br/>
 * 
 * @author zkl
 * @version
 * @see
 */
public class Task1 implements Runnable {

    @Override
    public void run() {
        try {
            for (int i = 1; i <= 1000; i++) {
                System.out.println("Task1..............i=" + i);
                Thread.sleep(3000);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

 


package cn.java.runnable;

/**
 * Description: <br/>
 * Date: 上午9:41:10 <br/>
 * 
 * @author zkl
 * @version
 * @see
 */
public class Task2 implements Runnable {

    @Override
    public void run() {

        for (int j = 1; j <= 1000; j++) {
            System.out.println("Task2..............j=" + j);
        }

    }

}

 


package cn.java.runnable;

/**
 * Description: <br/>
 * Date: 上午8:58:21 <br/>
 * 
 * @author zkl
 * @version
 * @see
 */
public class Window {

    public static void main(String[] args) {
        Task1 task1 = new Task1();// 任务一
        // Task2 task2 = new Task2();// 任务二

        Thread th1 = new Thread(task1);
        // Thread th2 = new Thread(task2);

        th1.start();
        // th2.start();
    }

}

四、线程安全问题(*)

1.什么是线程安全问题?

当多个线程操作同一共享数据时,最终的结果不正常的问题

2.如何解决线程安全问题?

给完成某一任务的代码块上锁


package cn.java.synchronize;

/**
 * Description: 模拟火车售票系统 <br/>
 * Date: 上午10:19:02 <br/>
 * 
 * @author zkl
 * @version
 * @see
 */
public class TicketSystem implements Runnable {
    private static int ticket = 200;// 武汉--->北京:200张票

    @Override
    public void run() {// 卖票
        try {
            for (int i = 1; i <= 3000; i++) {
                synchronized (TicketSystem.class) {
                    Thread.sleep(10);//
                    if (ticket > 0) {// 还有票
                        ticket = ticket - 1;
                        System.out.println("哈哈,我买到票了,还剩" + ticket + "张票");
                    } else {// ticket<=0
                        System.out.println("亲,票已经卖完了");
                        System.exit(0);
                    }
                }
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}




package cn.java.synchronize;

/**
 * Description: <br/>
 * Date: 上午10:35:41 <br/>
 * 
 * @author zkl
 * @version
 * @see
 */
public class TicketWindow {

    public static void main(String[] args) {
        TicketSystem ts = new TicketSystem();// 火车售票系统

        Thread wuhan = new Thread(ts);// 武汉售票
        Thread hunan = new Thread(ts);// 湖南售票
        Thread changchun = new Thread(ts);// 长春售票

        // 开始抢票
        wuhan.start();
        hunan.start();
        changchun.start();
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值