zoukankan      html  css  js  c++  java
  • JAVA笔记:多线程的理解及应用(三)

    本篇讨论线程的更多功能。

    实例:设计一个线程操作类,要求产生三个线程对象,并且分别设置三个线程的休眠时间,问该如何设计?

    下面通过继承Thread类的方法和调用Runnable接口的方法来分别实现。


    继承Thread类:

    class MyThread extends Thread {
    	private int time;
    
    	public MyThread(String name, int time) {
    		super(name); //Thread类中存在name属性,直接使用即可
    		this.time = time;
    	}
    
    	public void run() {
    		try {
    			Thread.sleep(this.time);
    		} catch (Exception e) {
    			// TODO: handle exception
    			e.printStackTrace();
    		}
    		System.out.println(Thread.currentThread().getName() + "线程,休眠"
    				+ this.time + "毫秒");
    	}
    }
    
    public class ThreadTest02 {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		MyThread my1 = new MyThread("A", 1000);
    		MyThread my2 = new MyThread("B", 2000);
    		MyThread my3 = new MyThread("C", 3000);
    		my1.start();
    		my2.start();
    		my3.start();
    	}
    
    }

    使用Runnable接口:

    class MyThread implements Runnable {
    	private int time;
    	private String name;
    
    	public MyThread(String name, int time) {
    		this.name = name;
    		this.time = time;
    	}
    
    	public void run() {
    		try {
    			Thread.sleep(this.time);
    		} catch (Exception e) {
    			// TODO: handle exception
    			e.printStackTrace();
    		}
    		System.out.println(this.name + "线程,休眠"
    				+ this.time + "毫秒");
    	}
    }
    
    public class ThreadTest02 {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		MyThread my1 = new MyThread("A", 1000);
    		MyThread my2 = new MyThread("B", 2000);
    		MyThread my3 = new MyThread("C", 3000);
    		new Thread(my1).start();
    		new Thread(my2).start();
    		new Thread(my3).start();
    	}
    
    }


    同步和死锁

    同步是一个很重要的概念,初次可能不好理解,举个例子:

    卖火车票。会有不同的售票点,但是在使用多线程的同时可能某个线程的火车票卖了以后没有自减,另一个线程就在继续卖,所以会导致余票变成负数。

    所以此时要加入同步这个功能,让多线程在某一时间段只能有一个线程在运行,其他线程必须等待该线程结束,此时就不会出现数据问题。

    使用同步的方法主要有:

    同步代码块。

    格式:

    synchronized(同步对象){
    		//需要同步的代码
    	}

    同步代码块后虽然不会出现问题,但是程序的执行效率很低。


    同步方法。

    格式:

    synchronized 方法返回值 方法名称(参数){
    		//代码;
    	}


    线程的死锁会在另一篇博客中专门讨论。


    线程的生命周期


    线程的生命周期如下图:



    要想让线程停止,可以用suspend()方法暂时挂起线程,用resume()方法恢复挂起的线程,同时停止线程可以用stop();

    但是以上三种都会产生死锁,所以不推荐使用。

    要想让线程停止,可以设置标志flag,运行一定次数后调用该方法。



  • 相关阅读:
    ReentrantReadWriteLock锁例子
    线程安全的atomic wrapper classes例子
    统一处理jquery ajax请求过程中的异常错误信息的机制
    理解RESTful架构
    适配器模式的两种实现方式
    第一部分:开发前的准备-第一章 什么是Andorid
    cocos2d-x开发记录:二,基本概念(骨骼动画)
    cocos2d-x开发记录:二,基本概念(粒子系统,Scheduler和定时器)
    cocos2d-x开发记录:二,基本概念(导演,场景,层和精灵,场景切换,效果)
    cocos2d-x开发记录:二,基本概念(动作,动画,坐标系统)
  • 原文地址:https://www.cnblogs.com/tryitboy/p/4231122.html
Copyright © 2011-2022 走看看