勤学思培训网OHOWMM
  • 总算懂得java多线程编程技巧

    1java多线程编程技巧

    认识Thread和Runnable

    java多线程编程技巧有哪些?Java中 实现多线程有两种途径:继承Thread类或者实现Runnable接口。Runnable是接口,建议用接口的方式生成线程,因为接口可以实现多继承,况且Runnable只有一个run方法,很适合继承。在使用Thread的时候只需继承Thread,并且new一个实例出来,调用 start()方法即可以启动一个线程。

    [图片0]

    Thread Test = new Thread();

    ();

    在使用Runnable的时候需要先new一个实现Runnable的实例,之后启动Thread即可。

    Test impelements Runnable;

    Test t = new Test();

    Thread test = new Thread(t);

    ();

    总结:Thread和Runnable是实现java多线程的2种方式,runable是接口,thread是类,建议使用runable实现 java多线程,不管如何,最终都需要通过()来使线程处于可运行状态。

    认识Thread的start和run

    1) start:用 start方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码。通过调用Thread类的 start()方法来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,一旦得到cpu时间片,就开始执行run()方法,这里方法 run()称为线程体,它包含了要执行的这个线程的内容,Run方法运行结束,此线程随即终止。

    2) run:run()方法只是类的一个普通方法而已,如果直接调用Run方法,程序中依然只有主线程这一个线程,其程序执行路径还是只有一条,还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码,这样就没有达到写线程的目的。

    总结:调用start方法方可启动线程,而run方法只是thread的一个普通方法调用,还是在主线程里执行。

    2java多线程编程实例一

    三个售票窗口同时出售20张票;

    程序分析:1.票数要使用同一个静态值

    2.为保证不会出现卖出同一个票数,要java多线程同步锁。

    设计思路:1.创建一个站台类Station,继承Thread,重写run方法,在run方法里面执行售票操作!售票要使用同步锁:即有一个站台卖这张票时,其他站台要等这张票卖完!

    2.创建主方法调用类

    (一)创建一个站台类,继承Thread

    package ;

    public class Station extends Thread {

    // 通过构造方法给线程名字赋值

    public Station(String name) {

    super(name);// 给线程名字赋值

    }

    // 为了保持票数的一致,票数要静态

    static int tick = 20;

    // 创建一个静态钥匙

    static Object ob = "aa";//值是任意的

    // 重写run方法,实现买票操作

    @Override

    public void run() {

    while (tick > 0) {

    synchronized (ob) {// 这个很重要,必须使用一个锁,

    // 进去的人会把钥匙拿在手上,出来后才把钥匙拿让出来

    if (tick > 0) {

    (getName() + "卖出了第" + tick + "张票");

    tick--;

    } else {

    ("票卖完了");

    }

    }

    try {

    sleep(1000);//休息一秒

    } catch (InterruptedException e) {

    ();

    }

    }

    }

    }

    (二)创建主方法调用类

    package ;

    public class MainClass {


    public static void main(String[] args) {

    //实例化站台对象,并为每一个站台取名字

    Station station1=new Station("窗口1");

    Station station2=new Station("窗口2");

    Station station3=new Station("窗口3");

    // 让每一个站台对象各自开始工作

    ();

    ();

    ();

    }

    }

    3java多线程编程实例二

    两个人AB通过一个账户A在柜台取钱和B在ATM机取钱!

    程序分析:钱的数量要设置成一个静态的变量。两个人要取的同一个对象值

    (一)创建一个Bank类

    package ;

    public class Bank {

    // 假设一个账户有1000块钱

    static int money = 1000;

    // 柜台Counter取钱的方法

    public void Counter(int money) {// 参数是每次取走的钱

    -= money;//取钱后总数减少

    ("A取走了" + money + "还剩下" + ());

    }

    // ATM取钱的方法

    public void ATM(int money) {// 参数是每次取走的钱

    -= money;//取钱后总数减少

    ("B取走了" + money + "还剩下" + ());

    }

    }

    (二)创建一个PersonA类

    package ;

    public class PersonA extends Thread {

    // 创建银行对象

    Bank bank;

    // 通过构造器传入银行对象,确保两个人进入的是一个银行

    public PersonA(Bank bank) {

    = bank;

    }

    //重写run方法,在里面实现使用柜台取钱

    @Override

    public void run() {

    while ( >= 100) {

    (100);// 每次取100块

    try {

    sleep(100);// 取完休息秒

    } catch (InterruptedException e) {

    ();

    }

    }

    }

    }

    (三)创建一个PersonB类

    package ;

    public class PersonB extends Thread {

    // 创建银行对象

    Bank bank;

    // 通过构造器传入银行对象,确保两个人进入的是一个银行

    public PersonB(Bank bank) {

    = bank;

    }

    // 重写run方法,在里面实现使用柜台取钱

    @Override

    public void run() {

    while ( >= 200) {

    (200);// 每次取200块

    try {

    sleep(100);// 取完休息秒

    } catch (InterruptedException e) {

    ();

    }

    }

    }

    }

    (四)创建主方法的调用类

    package ;

    public class MainClass {


    public static void main(String[] args) {

    // 实力化一个银行对象

    Bank bank = new Bank();

    // 实例化两个人,传入同一个银行的对象

    PersonA pA = new PersonA(bank);

    PersonB pB = new PersonB(bank);

    // 两个人开始取钱

    ();

    ();

    }

    }

    4java多线程编程实例三

    设计四个线程对象对同一个数据进行操作

    两个线程执行减操作,两个线程执行加操作。

    程序分析:

    1.创建一个ThreadAddSub类继承Thread,重写run方法

    2.在run方法里面实现加和减的操作,每次操作后睡眠1秒

    3.创建主方法调用类

    (一)创建一个ThreadAddSub类

    package ;

    public class ThreadAddSub extends Thread {

    //判断要进行的操作

    boolean operate = true;

    //要操作的数

    static int sum = 0;

    // 把操作运算通过构造方法传进来

    public ThreadAddSub(boolean operate) {

    super();

    = operate;

    }

    @Override

    public void run() {

    ();

    while (true) {

    if (operate) {

    sum+=5;

    ("加后,sum="+sum);

    } else {

    sum-=4;

    ("减后,sum="+sum);

    }

    try {

    sleep(500);// 睡眠秒

    } catch (InterruptedException e) {

    ();

    }

    }

    }

    }

    (二)创建主方法调用类

    emptypackage ;

    public class MainClass {


    public static void main(String[] args) {

    //创建一个存放ThreadAddSub对象的数组

    ThreadAddSub[] tSub=new ThreadAddSub[4];

    for (int i = 0; i < ; i++) {

    //把实例化ThreadAddSub对象赋值到数组内

    //第一三个是true,二四个是false

    tSub[i]=new ThreadAddSub(i%2==0?true:false);

    //让线程开始工作

    tSub[i].start();

    }

    }

    }