java并发多线程

1. 线程是什么?线程和进程的区别?

一个进程就是一个应用程序,线程就是一个进程中处理不同任务的指令;一个应用程序只有一个主进程,一个进程至少有一个线程。同一个进程中的多个线程之间可以并发执行;相对进程而言,线程是一个更加接近于执行体的概念,它可以与同进程中的其他线程共享数据,但拥有自己的栈空间,拥有独立的执行序列。

以下有一个例子,想深入理解可查看:

http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html

2. 线程有什么用?

线程是执行任务的一种方式,如果想要同时执行多任务,就必须使用多线程。

1)  使用多线程可以减少程序的响应时间。

2)  与进程相比,线程的创建和切换开销更小。

3)  多CPU或多核计算机本身就具有执行多线程的能力,如果使用单个线程,将无法重复利用计算机资源,造成资源的巨大浪费。

4)  使用多线程能简化程序的结构,使程序便于理解和维护。

3. 实现多线程的方式

1)继承Thread类创建线程:

Thread类本质上是实现了Runnable接口的一个实例,启动线程的唯一方法就是通过Thread类的start()实例方法。通过自己的类直接extend Thread并复写run()方法,就可以启动新建成并执行自己定义的run()方法。如:

public class MyThread extends Thread {
    @Override
    public void run() {
        System.out.println("我是线程!");
    }
}

启动线程如下:

MyThread myThread1 = new MyThread();
myThread1.start();
MyThread myThread2 = new MyThread();
myThread2.start();


2)实现Runnable接口创建线程:

如果自己的类已经extend另一个类,就无法直接extend Thread,此时,就可以实现一个Runnable接口,为了启动MyThread,需要实例化一个Thread,并传入自己的MyThread实例;当传入后,Thread的run()方法就会调用Target.run()。如:

public class MyThread2 extends Other implements Runnable {
    @Override
    public void run() {
        System.out.println("我是线程!");
    }
}

启动线程如下:

MyThread2 myThread2 = new MyThread2();
Thread thread = new Thread(myThread2);
thread.start();

3)使用ExecutorService、Callable、Future实现又返回结果的线程(此方法较少用,如果有返回值,需要返回结果可用此方法)

4. 多线程运行原理

主线程启动:
第一步:启动子线程a、启动子线程b、启动子线程c
第二步:子线程a run()、子线程b run()、子线程c run()
第三步:子线程a完成、子线程b完成、子线程c完成
第四步:全部线程完成,提出程序。
在一个程序中,写独立运行的程序片段叫作“线程”,利用它编程的概念就叫作“多线程处理”。
多线程就像火车的每一节车厢,而进程就是火车;车厢离开火车是无法运行的。多线程的出现就是为了并发执行任务。

5. synchronized是什么?使用方法?

synchronized是java中的关键字,是一种同步锁。可以修饰一个代码块、方法、静态的方法、类。其作用范围和作用对象就是被修饰的这个东西。

详情参考范例如下:

原文:http://blog.csdn.net/luoweifu/article/details/46613015 
作者:luoweifu 

6. 死锁是什么?在什么情况会发生?

是指两个或者两个以上的进程在执行过程中,因为抢夺资源而造成的一种互相等待的现象,若无外力作用,程序都无妨再进行下去。

产生死锁的原因主要是: 
(1) 因为系统资源不足。 
(2) 进程运行推进的顺序不合适。 
(3) 资源分配不当等。

产生死锁的四个必要条件: 
(1) 互斥条件:一个资源每次只能被一个进程使用。 
(2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。 
(3) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。 
(4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

7. 执行器(Exector) 

1):线程执行器分离了任务的创建和执行。
2):使用线程池来提高程序的性能。
3):执行器可以处理时限了Callable接口的任务。
    a:Callable主方法名称为call(),可以返回结果
    b:当发送一个Callable对象给执行器时,将获得一个时限了Future接口的对象,可以使用这个对象来控制Callable对象的状态和结果
4):提供了一些操作线程任务的功能 

8. 使用ExectorService 线程池、定时器(心跳检测)

线程池的概念:线程池是一种多线程处理形式,处理过程中将任务添加到队列,如果线程池中有空闲的线程,则由该线程去完成这些任务。
(1):创建固定大小的线程池:Exectutoers.newFixedThreadPool(3);
(2):创建缓存线程池:Executors.newCachedThreadPool(3)
    当任务扔进线程池中如果当前创建的线程不够来处理任务的话,就自动添加跟任务数量相等的线程。
(3):创建单一线程池:Executors.newSingleThreadExecutor();
    跟创建单一线程并没有什么区别,但是它有一个好处,就是当这个线程死了以后,就会自动在创建一个替补线程。
定时器:
(1):调用SchenduleExecutorService的sechedule方法,返回的ScheduleFuture对象可以取消任务。
(2):支持间隔重复任务的定时方式,不直接支持绝对定时方式,需要转换成相对 时间方式。注意:scheduleAtFixedRate()这个方法里并没有传入Date这个参数的方法



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值