码迷,mamicode.com
首页 > 编程语言 > 详细

Java多线程

时间:2015-09-13 21:47:47      阅读:193      评论:0      收藏:0      [点我收藏+]

标签:

1.     多线程的创建方式

1.1 继承Thread类


package com.ilaoda.day0912;

public class MyThreadDemo {
	public static void main(String[] args) {
		MyThread my1 = new MyThread();
		MyThread my2 = new MyThread();

		my1.start(); //开启线程
		my2.start();
	}
}

// 继承Thread类
class MyThread extends Thread {
	@Override
	public void run() {  //运行线程
		for (int x = 0; x < 200; x++) {
			System.out.println(x);
		}
	}
}

1.2 实现Runnable接口


package cn.itcast_05;

/*
 * 方式2:实现Runnable接口
 * 步骤:
 * 		A:自定义类MyRunnable实现Runnable接口
 * 		B:重写run()方法
 * 		C:创建MyRunnable类的对象
 * 		D:创建Thread类的对象,并把C步骤的对象作为构造参数传递
 */
public class MyRunnableDemo {
	public static void main(String[] args) {
		
		// 创建MyRunnable类的对象
		MyRunnable my = new MyRunnable();

		Thread t1 = new Thread(my, "林青霞");
		Thread t2 = new Thread(my, "刘意");

		t1.start();
		t2.start();
	}
}

class MyRunnable implements Runnable {
	@Override
	public void run() {
		for (int x = 0; x < 100; x++) {
			// 由于实现接口的方式就不能直接使用Thread类的方法了,但是可以间接的使用
			System.out.println(Thread.currentThread().getName() + ":" + x);
		}
	}

}



1.3 


2.    多线程同步

  • 多个线程的锁必须是同一把锁

2.1 同步代码块

  • 格式:
synchronized(锁对象) {
    需要被同步的代码;
}
  • 锁对象:任意,Object 
  • 示例

public void run() {
	while (true) {
		synchronized (obj) {
			if (tickets > 0) {
				try {
					Thread.sleep(100);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				System.out.println(Thread.currentThread().getName()
						+ "正在出售第" + (tickets--) + "张票");
			}
		}
	}
}

2.2 同步方法

  • 格式:private synchronized void sellTicket() { }
  • 锁对象:this
  • 示例:
public void run() {
	while (true) {
		if(x%2==0){
			synchronized (this) {  //锁对象
				if (tickets > 0) {
					try {
						Thread.sleep(100);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					System.out.println(Thread.currentThread().getName()
							+ "正在出售第" + (tickets--) + "张票 ");
				}
			}
		}else {
			sellTicket();				
		}
		x++;
	}
}

private synchronized void sellTicket() {
	if (tickets > 0) {
		try {
				Thread.sleep(100);
		} catch (InterruptedException e) {
				e.printStackTrace();
		}
		System.out.println(Thread.currentThread().getName()
					+ "正在出售第" + (tickets--) + "张票 ");
	}
}


2.3 静态同步方法

  • 格式:private static synchronized void sellTicket() { }
  • 锁对象:类的字节码文件对象,SellTicket.class
  • 示例:
public void run() {
	while (true) {
		if(x%2==0){
			synchronized (SellTicket.class) {  //锁对象
				if (tickets > 0) {
					try {
						Thread.sleep(100);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					System.out.println(Thread.currentThread().getName()
							+ "正在出售第" + (tickets--) + "张票 ");
				}
			}
		}else {
			sellTicket();				
		}
		x++;
	}
}

private static synchronized void sellTicket() {
	if (tickets > 0) {
		try {
				Thread.sleep(100);
		} catch (InterruptedException e) {
				e.printStackTrace();
		}
		System.out.println(Thread.currentThread().getName()
				+ "正在出售第" + (tickets--) + "张票 ");
	}
}

    线程安全的类:


  • StringBuffer
  • Vector
  • Hashtable
  • 如何把一个线程不安全的集合类变成一个线程安全的集合类:用Collections工具类的方法即可。


3.    线程调度——常见方法


  • 休眠线程:sleep( )
  • 加入线程:join( )
  • 礼让线程:yeild( )
  • 后台线程:setDmeo( )
  • 终止线程:stop( )、interrupt( )

3.1 休眠线程:sleep( )


3.2 加入线程:join( )


3.3 礼让线程:yeild( )


3.4 后台线程:setDmeo( )



3.5 终止线程:stop( )、interrupt( )


4.    死锁问题










Java多线程

标签:

原文地址:http://my.oschina.net/ilaoda/blog/505621

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!