java中的多线程

---------------------------------------- android培训java培训、期待与您交流! ------------------------------------

不是所有的语言都支持多线程,JAVA是支持多线程的语言之一      

 进程:正在进行中的程序(直译),进程就是对应一个应用程序在内存空间所属的空间。

windows有windows的内存空间,java有java的内存空间。     

windows操作系统中,任务管理器中里面的,exe进程就是正在进行的程序。      

线程:就是负责进程中内容执行的一个控制单元,也称为执行路径。一个进程中可以有多个执行路径(控制单元),所以称之为多线程

一个进程至少有一个线程 当我们想让多部分代码同时执行,我们就用多线程每一个线程都有自己要执行的任务,<多线程的好处与弊端:CPU执行是随机切换的,切换的速度非常的快,如果程序开多了还是会慢,因为抢不到执行权。

多线程的好处:

解决了多个程序同时执行。

弊端:线程太多导致效率的降低。JVM中的线程:JVM启动时就启动了多条线程至少有两个线程:Main线程、垃圾回收线程

主线程在执行的过程中,垃圾回收期也会在不定时地来回收垃圾。创建线程的两种方式:

1.继承Thread类,重写run()方法;run()方法就是封装自定义线程的函数。

2.实现Runnable接口。推荐使用第二种,比较符合面向对象的特征。

线程状态图:



卖票事例:

<span style="font-family: Arial, Helvetica, sans-serif;">package thread;</span>
public class TicketDemo implements Runnable {
	public int num = 100;
	private Object obj = new Object();

	@Override
	public void run() {
		sale();
	}

	public void sale() {

		while (true) {
			synchronized (obj) {
				if (num > 0) {

					try {
						Thread.sleep(100);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					System.out.println(Thread.currentThread().getName()
							+ " sale ....." + num--);
				}
			}
		}
	}

	public static void main(String[] args) {
		TicketDemo ticket = new TicketDemo();
		Thread t1 = new Thread(ticket);
		Thread t2 = new Thread(ticket);
		Thread t3 = new Thread(ticket);
		t1.start();
		t2.start();
		t3.start();
	}

}

synchronized(Object){}同步代码块:

synchronized主要用来处理线程安全的,Object对象相当于一个锁,一个线程进入同步代码块中后,其它线程处了临时堵塞状态,无法执行,必须要等同步代码块中的数据执行完毕后,然后释放了锁,下一条线程才可以进入。

比喻:火车上的厕所,当人进入的了厕所,厕所旁边的灯显示有人,其他人就无法进入了,非得你方便完以后开门出去,显示无人,其他人才能进入。

同步的好处与弊端

好处:解决了线程安全问题。
弊端:效率低,因为同步外的线程都会判断同步锁。


同步的前提:

多个线程使用的是同一把锁。要想多个线程使用同一把锁,需要把锁的对象放在成员变量中,几条线程共享着同一把锁

同步函数事例:

同步函数的锁是this;静态同步锁使用的是.getClass()字节码对象.
同步代码块的锁是任意的对象;
建议使用代码块;

package thread;


/**
 * 两个储户,每个月每张卡存100,存3次
 * @author liujie
 *
 */
class Bank {
	private int sum;

	public synchronized void add(int num) {
		sum += num;
		System.out.println("sum=" + sum);
	}
}

class Cus implements Runnable {
	private Bank bank = new Bank();

	@Override
	public  void run() {
	
			for (int i = 0; i < 3; i++) {
				bank.add(100);
			}
		}
	

}

public class BankTest {
	public static void main(String[] args) {
		Cus cusTest = new Cus();
		Thread t1 = new Thread(cusTest);
		Thread t2 = new Thread(cusTest);
		t1.start();
		t2.start();
	}
}


 死锁:常见的情况之一,同步的嵌套,A拥有B的锁,B拥有A的锁,程序表现方式,同步代码块中嵌入同步函数this锁,同步函数中嵌入同步代码块锁。

死锁Code:
package thread;

public class DeadLoockDemo {
	public static void main(String[] args) {
		Ticket1 tt = new Ticket1();
		Thread t1 = new Thread(tt);
		Thread t2 = new Thread(tt);
		t1.start();
		try {
			Thread.sleep(200);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		tt.flag = false;
		t2.start();
	}

}

class Ticket1 implements Runnable {
	private int num = 100;
	public boolean flag = true;
	private Object obj = new Object();

	@Override
	public void run() {
		if (flag) {
			while (true) {
				synchronized (obj) {
					show();
				}
			}
		} else {
			while (true) {
				show();
			}
		}

	}

	public synchronized void show() {

		synchronized (obj) {
			if (num > 0) {
				try {
					Thread.sleep(10);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				System.out.println(Thread.currentThread().getName()
						+ "同步方法嵌入同步代码块" + num--);
			}
		}

	}
}

----------------------------------------  android培训 java培训 、期待与您交流! ------------------------------------
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值