java线程基础

1、什么是线程
线程是操作系统能够进行运算调度的最小单位,包含在进程之内
2、线程和进程有什么区别
线程是进程的子集,不同的进程使用不同的内存空间,但是所有的线程共享一篇形同的内存空间,每个线程都拥有单独的栈内存用来存储本地数据
3、如何在java中实现线程
继承Thread的类或者实现Runnable接口重写run()方法
4、用Runnable还是Thread
java不支持多重继承,所以实现Runnable接口会好一点,这样的话,你还可以继承其他的类
5、Thread类中的start()和run()方法有什么区别?
sart()方法被用来启动新创建的线程,而且start()内部调用了run()方法,这和直接调用run()方法的效果是不一样的。当你调用run()方法的时候,只会在原来的线程中调用,没有新的线程启动,start()方法才会启动新的线程
6、Java中Runnable和Callable有什么不同?
两者都代表那些要在不同的线程中执行的任务,Runnable从JDK1.0就开始了,Callable是在JDK1.5增加的,他们主要的区别是Callable的call()方法可以返回值和抛出异常,而Runnable没有这些功能
7、java的内存模型是什么?
java内存模型规定和指引Java程序在不同的内存架构,CPU和操作系统间有确定行的行为,java内存模型对一个线程所做的变动能被其他线程可见提供保证,
8、java中volatile变量是什么?
volatile是一个特殊的修饰符,只有成员变量才能使用他。在java并发程序取消同步类的情况下,多线程对成员变量的操作对其他线程是透明的。volatile变量可以保证下一个读取操作会在前一个写操作之后发生。
9、什么是线程安全?Vector十一个线程安全类吗?
线程安全:如果你代码所在的进程中有多个线程在同事运行,而这些线程可能会同时运行这段代码,如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样,就是线程安全。
Vector是用同步的方法类实现线程安全的,而和他蕾西的ArrayList不是线程安全的。
10、Java中如何停止一个线程?
a、JDK1.0:原本还有一些stop(),suspend(),resume()的控制方法,但是存在潜在的死锁威胁。
b、后续的JDK中当run()或者call()方法之慈宁宫万的时候,线程会自动结束,如果要手动结束一个线程,可以使用volatile布尔变量来退出run()方法的循环或者取消任务来中断线程
11、一个线程运行时发生异常会怎么样?
a、如果异常没有被捕获该线程将会停止执行,Thread,UncaughtExceptionHandler是用于处理未捕获异常造成线程turn中断情况的一个内嵌接口,当一个未捕获异常将造成线程中断的时候JVm会使用Thread.getUncaughtExceptionHandler()来查询线程的UncaughtExceptionHandler并将线程和异常作为参数传递给handler的uncaughtException()方法进行处理
12、Java中notify和notifyAll有什么区别
notify()方法不能唤醒某个具体的线程,所以一个线程在等待的时候它才有用武之地。
notifyAll()唤醒所有线程并允许他们争夺所确保了至少有一个线程能继续运行
13、什么是ThreadLcoal变量
ThreadLocal是Java里一种特殊的变量,每个线程都有一个ThreadLocal就是每个线程都拥有了自己独立的一个变量,竞争条件被彻底消除了,他是穿件代价高昂的对象获取线程全的好方法。
14、为什么wait和notify方法要早同步块中调用?
主要是因为JavaAPI强制要求这样做,如果你不这么么做,你的代码会抛出IIIegalMontiorStateExceptipon异常。还有一个原因是为了避免wait和notify之间昌盛竞态条件。
15、Java中的同步集合和并发集合有什么区别?
a、同步集合和并发结合都为多线程和并发提供了合适的线程安全的集合,不过并发集合的可扩展性更高,
b、在jdk1.5之前程序员只有同步结合用在多线程并发的时候会导致争用,阻碍了系统的可拓展。
c、java5介绍了并发集合像ConcurrentHashMap,不仅提供线程安全还有锁分离和内部分区都现代技术提高了可扩展性。
16、JAVA中的堆和栈有什么不同?
a、每个线程都有自己的栈内存,用于存储本地变量,方法参数和栈调用,一个线程中存储的变量对其他线程是不可见的。而堆是所有线程共享的一片公用内存区域。
17、什么是线程池,为什么要使用它?
在程序启动的时候就创建若干的线程来响应处理,它们被称为线程池,从java5开始,api提供了Executor框架让你可以创建不同的线程池。
18,java多线程中的死锁
死锁是指两个或连个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,弱无外力的作用,他们都将无法推进下去。
避免死锁最简单的方法就是阻止循环等待条件,将系统中所有的资源设置标志位,排序,规定所有的进程申请资源必须以一定的顺序做操作来避免死锁
19、怎么检测一个线程是否拥有锁?
Thread中有一个方法叫holdsLock(),他返回true,当且仅当前线程拥有某个具体对象的锁
20、java线程池中submit()和execute()方法有什么区别?
a、两个方法都可以向线程池提交任务
b、execute()方法的返回值类型是void,他定义在Executor接口中,而submit()犯法可以返回持有计算结果的Future对象,它定义在ExecutorService接口中,它扩展了Executor接口。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值