「java线程变量面试题」java线程笔试题
本篇文章给大家谈谈java线程变量面试题,以及java线程笔试题对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
java有关线程的面试题
线程,你要弄清楚几个概念:
1、什么是线程?(进程中的子进程或从主进程中产生的子程序)
2、怎么创建线程?(继承了Thread类或实现了Runnable接口的类)
3、线程怎么运行?(抢占CPU时间,分片运行)
4、线程中同步的概念?(多个线程访问同一个对象时排队和不排队的问题)
5、线程的生命周期有哪些?(不存在-创建-运行、等待、睡眠、-死亡)
6、死锁?(A线程中用到B线程的资源,B中同时也用到A,若同时运行AB,在同步的情况下会出现A等B结束,B等A结束,这样同时无限等待)
Java常见的面试问题(带答案),自己答出来多少
1、在java中如果声明一个类为final,表示什么意思?
答:final是最终的意思,final可用于定义变量、方法和类但含义不同,声明为final的类不能被继承。
父类的构造方法是否可以被子类覆盖(重写)?
答:父类的构造方法不可以被子类覆盖,因为父类和子类的类名是不可能一样的。
2、请讲述String 和StringBuffer的区别。
答:String 类所定义的对象是用于存放”长度固定”的字符串。
StringBuffer类所定义的对象是用于存放”长度可变动”的字符串。
3、如果有两个类A、B(注意不是接口),你想同时使用这两个类的功能,那么你会如何编写这个C类呢?
答:因为类A、B不是接口,所以是不可以直接继承的,但可以将A、B类定义成父子类,那么C类就能实现A、B类的功能了。假如A为B的父类,B为C的父类,此时C就能实现A、B的功能。
4、谈谈你对抽象类和接口的理解。
答:定义抽象类的目的是提供可由其子类共享的一般形式、子类可以根据自身需要扩展抽象类、抽象类不能实例化、抽象方法没有函数体、抽象方法必须在子类中给出具体实现。他使用extends来继承。
接口:一个接口允许一个类从几个接口继承而来,Java 程序一次只能继承一个类但可以实现几个接口,接口不能有任何具体的方法,接口也可用来定义可由类使用的一组常量。其实现方式是interface来实现。
5、Java中什么是竞态条件?
答:竞态条件会导致程序在并发情况下出现一些bugs。多线程对一些资源的竞争的时候就会产生竞态条件,如果首先要执行的程序竞争失败排到后面执行了,那么整个程序就会出现一些不确定的bugs。这种bugs很难发现而且会重复出现,因为线程间的随机竞争。
6、Java中如何停止一个线程?
答:Java提供了很丰富的API但没有为停止线程提供API。JDK 1.0本来有一些像stop(), suspend() 和 resume()的控制方法但是由于潜在的死锁威胁因此在后续的JDK版本中他们被弃用了,之后Java API的设计者就没有提供一个兼容且线程安全的方法来停止一个线程。当run() 或者 call() 方法执行完的时候线程会自动结束,如果要手动结束一个线程,你可以用volatile 布尔变量来退出run()方法的循环或者是取消任务来中断线程。点击这里查看示例代码。
7、 一个线程运行时发生异常会怎样?
答: 简单的说,如果异常没有被捕获该线程将会停止执行。Thread.UncaughtExceptionHandler是用于处理未捕获异常造成线程突然中断情况的一个内嵌接口。当一个未捕获异常将造成线程中断的时候JVM会使用Thread.getUncaughtExceptionHandler()来查询线程的UncaughtExceptionHandler并将线程和异常作为参数传递给handler的uncaughtException()方法进行处理。
java 线程面试题
我不知道你是不是这个意思,thread1,thread2两个线程每次让j增加1,thread3,thread4两个线程每次让j减少1,四个线程每个都调用250次相关加减一操作。最终j的结果都是100.
下面程序,总计会打印出1000个数,不管怎么样最后一个数永远是100,即j的终值永远是100,为了看中间结果运行过程我加了sleep,但无关紧要。你看看符合你要求不?
就像楼上说的,启动1000条线程不是很明白,不一致的继续讨论
package com.kalort;
public class ThreadTest
{
public static void main(String[] args)
{
Operator operator = new Operator();
Thread thread1 = new IncreaseThread(operator);
Thread thread2 = new IncreaseThread(operator);
Thread thread3 = new DecreaseThread(operator);
Thread thread4 = new DecreaseThread(operator);
thread1.start();
thread2.start();
thread3.start();
thread4.start();
}
}
class IncreaseThread extends Thread
{
private Operator operator;
public IncreaseThread(Operator operator)
{
this.operator = operator;
}
public void run()
{
for (int i = 0; i 250; i++)
{
try
{
Thread.sleep((long)(Math.random() * 100));
}
catch (InterruptedException e)
{
e.printStackTrace();
}
operator.increase();
}
}
}
class DecreaseThread extends Thread
{
private Operator operator;
public DecreaseThread(Operator operator)
{
this.operator = operator;
}
public void run()
{
for (int i = 0; i 250; i++)
{
try
{
Thread.sleep((long)(Math.random() * 100));
}
catch (InterruptedException e)
{
e.printStackTrace();
}
operator.decrease();
}
}
}
class Operator
{
private int j = 100;
public synchronized void increase()
{
while (100 != j)
{
try
{
wait(); // 如果另外线程还没减一就等待
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
j++;
System.out.println(j);
notify(); // 通知另外线程已经加一了。
}
public synchronized void decrease()
{
while (100 == j)
{
try
{
wait();
}
catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
j--;
System.out.println(j);
notify();
}
}
关于java线程变量面试题和java线程笔试题的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。