Java多线程和高并发

多线程有什么用?
  1、发挥多核CPU优势。在单核CPU中进行的多线程并不是真正的多线程,只是多个进程切换的比较快看着像多线程。多核CPU的多线程才是真正的多线程。
  2、防止阻塞。在单线程下若线程发生了阻塞整个程序就会停止运行。多线程可以防止这个问题,如果有一个线程阻塞了也不会影响其他线程的运行。
  3、便于建模。
什么是线程什么是进程?
  进程指正在运行的程序的实例,是系统进行资源调度和分配的独立单位。
  线程是进程的实体,是CPU调度和分派的基本单位。一个进程可以有多个线程,多个线程可以并发执行。
线程的状态
  新建:创建一个线程,但是没有任何一个可以运行的实体。
  就绪:将程序变量实体放入线程中
  运行:运行放入的程序。
  阻塞:程序暂停,等待自动唤醒或被动唤醒。
  结束:正常结束或异常退出。
线程的实现
  1、单继承(继承Thread类)

class MyFirstThread extends Thread{
	private i = 0;
	public void run(){
		for(i = 0;i<100;i++){
			//Thread.currentThread()获取当前线程对象
			System.out.println(Thread.currentThread().getName()+"......"+i);
		}
	}
}
Thread firstThread = new MyFirstThread();
firstThread.start();

注:子类extends Thread时可以不重写run方法,但是当 子类线程对象.start()时是调用Thread类的run方法,此时run方法并不执行任何操作并返回。implements Runnable必须重写run方法。
  2、多实现

class MySecondThread implements Runnable{
	private int i = 0;
	public void run(){
		System.out.println(Thread.currentThread().getName()+"......"+i);
	}
}
//Runnable secondThread = new MySecondThread();
//secondThread.run();
Thread.myThread = new Thread(secondThread);
myThread.start();

start()和run()的区别
start()可以启动线程,run不能启动线程。run方法只是Thread类的一个普通方法。

注意:类的单继承和多实现在很大程度上决定了线程的实现方法。
缺点:执行完任务后无法获取执行结果,如果需要获取结果就必须使用共享变量或是网络通信的方式,非常麻烦。
3、Callable和Future(具有返回值的线程)
  Callable接口代表一段可以调用并返回结果的代码;Future表示异步任务。Callable接口中的方法是具有返回值的,是一个泛型。和Future、FutureTask配合可以获取异步执行的结果。

class MyCallable implements Callable<Integer>{
	private i = 0;
	public Integer call() throws Exception{
		int sum = 0;
		for(i=0;i<10;i++){
			System.out.println(Thread.currentThread().getName()+"..."+i);
			sum ++;
		}
		return sum;
	}
}
Callable<Integer> myCallable = new MyCallable();
FutureTask ft = new FutureTask<Integer>(myCallable);
Thread th = new Thread(ft);
th.start();

Future:对具体的Runnable、Callable的执行结果进行取消、查询是否完成、获取结果操作。
  FutureTask:因为Future是接口,无法创建对象,因此产生了FutureTask。
进程通信和线程通信(线程通信能避免线程对同一资源抢夺)
  线程通信:
  互斥量:采用互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限。因为互斥对象只有一个,因此可以保证同一时间只有一个进程访问公共资源。
  信号量机制:允许多个线程同一时刻访问同一资源,但是需要控制同一时刻访问此资源的最大线程数量。包括无名线程信号量和命名线程信号量。
  事件(信号)机制:通过通知操作的方式保持线程同步,还可以方便的实现多线程优先级的比较操作。
注:线程间的通信目的主要是线程同步,所以线程间的通信没有像进程间通信的数据交换机制。

进程通信:
  管道。管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。
  有名管道。半双工的通信方式,允许非亲缘关系的进程间使用。
  信号量:信号量是一个计数器,可以用来控制多个进程对共享资源的访问,它常用来作为一种锁机制防止多个进程同时访问某个资源。
  消息队列:消息队列就是一个消息的链表,存放在内核中,并由消息队列标识符标识。
  信号:信号是一种比较复杂的通信方式。用于通知接收某个事件已经发生。
  共享内存:共享内存就是映射一段能被其他进程访问的内存,这段内存由一个进程创建但是其他进程可以访问。共享内存是最快的IPC(进程间通信)方式,它是针对其他方式效率低而特别设计的。它往往同其他通信机制如信号量配合使用。
  套接字:它可用于不同进程间的进程通信。套接字明显的将客户和服务器区分出来,套接字可以实现将多个客户连接到一个服务器。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值