“迷你兔”通过精心收集,向本站投稿了7篇Java程序员面试中的多线程问题,下面小编给大家整理后的Java程序员面试中的多线程问题,供大家阅读参考。
- 目录
篇1:Java程序员面试中的多线程问题
0、java中多线程同步是什么?
在多线程程序下,同步能控制对共享资源的访问。如果没有同步,当一个java线程在修改一个共享变量时,另外一个线程正在使用或者更新同一个变量,这样容易导致程序出现错误的结果。
1、解释实现多线程的几种方法?
一java线程可以实现runnable接口或者继承thread类来实现,当你打算多重继承时,优先选择实现runnable。
2、thread.start与thread.run()有什么区别?
thread.start()方法(native)启动线程,使之进入就绪状态,当cpu分配时间该线程时,由jvm调度执行run()方法。
3、为什么需要run()和start()方法,我们可以只用run()方法来完成任务吗?
我们需要run()&start()这两个方法是因为jvm创建一个单独的线程不同于普通方法的调用,所以这项工作由线程的start方法来完成,start由本地方法实现,需要显示地被调用,使用这俩个方法的另外一个好处是任何一个对象都可以作为线程运行,只要实现了runnable接口,这就避免因继承了thread类而造成的java的多继承问题。
4、什么是threadlocal类,怎么使用它?
threadlocal是一个线程级别的局部变量,并非“本地线程”。threadlocal为每个使用该变量的线程提供了一个独立的变量副本,每个线程修改副本时不影响其它线程对象的副本(译者注)。
下面是线程局部变量(threadlocal variables)的关键点:
一个线程局部变量(threadlocal variables)为每个线程方便地提供了一个单独的变量。
threadlocal实例通常作为静态的私有的(private static)字段出现在一个类中,这个类用来关联一个线程。
当多个线程访问threadlocal实例时,每个线程维护threadlocal提供的独立的变量副本。
常用的使用可在dao模式中见到,当dao类作为一个单例类时,数据库链接(connection)被每一个线程独立的维护,互不影响。(基于线程的单例)
5、什么时候抛出invalidmonitorstateexception异常,为什么?
调用wait()/notify()/notifyall()中的任何一个方法时,如果当前线程没有获得该对象的锁,那么就会抛出illegalmonitorstateexception的异常(也就是说程序在没有执行对象的任何同步块或者同步方法时,仍然尝试调用wait()/notify()/notifyall()时)。由于该异常是runtimeexcpetion的子类,所以该异常不一定要捕获(尽管你可以捕获只要你愿意).作为runtimeexception,此类异常不会在wait(),notify(),notifyall()的方法签名提及。
6、sleep()、suspend()和wait()之间有什么区别?
thread.sleep()使当前线程在指定的时间处于“非运行”(not runnable)状态。线程一直持有对象的监视器。比如一个线程当前在一个同步块或同步方法中,其它线程不能进入该块或方法中。如果另一线程调用了 interrupt()方法,它将唤醒那个“睡眠的”线程。
注意:sleep()是一个静态方法。这意味着只对当前线程有效,一个常见的错误是调用t.sleep(),(这里的t是一个不同于当前线程的线程)。即便是执行t.sleep(),也是当前线程进入睡眠,而不是t线程。t.suspend()是过时的方法,使用suspend()导致线程进入停滞状态,该线程会一直持有对象的监视器,suspend()容易引起死锁问题。
object.wait()使当前线程出于“不可运行”状态,和sleep()不同的是wait是object的方法而不是thread。调用 object.wait()时,线程先要获取这个对象的对象锁,当前线程必须在锁对象保持同步,把当前线程添加到等待队列中,随后另一线程可以同步同一个对象锁来调用object.notify(),这样将唤醒原来等待中的线程,然后释放该锁。基本上wait()/notify()与sleep() /interrupt()类似,只是前者需要获取对象锁。
7、在静态方法上使用同步时会发生什么事?
同步静态方法时会获取该类的“class”对象,所以当一个线程进入同步的静态方法中时,线程监视器获取类本身的对象锁,其它线程不能进入这个类的任何静态同步方法。它不像实例方法,因为多个线程可以同时访问不同实例同步实例方法。
8、当一个同步方法已经执行,线程能够调用对象上的非同步实例方法吗?
可以,一个非同步方法总是可以被调用而不会有任何问题。实际上,java没有为非同步方法做任何检查,锁对象仅仅在同步方法或者同步代码块中检查。如果一个方法没有声明为同步,即使你在使用共享数据java照样会调用,而不会做检查是否安全,所以在这种情况下要特别小心。一个方法是否声明为同步取决于临界区访问(critial section access),如果方法不访问临界区(共享资源或者数据结构)就没必要声明为同步的。
下面有一个示例说明:common类有两个方法synchronizedmethod1()和method1(),mythread类在独立的线程中调用这两个方法。
public class common {
public synchronized void synchronizedmethod1() {
system.out.println(“synchronizedmethod1 called”);
try {
thread.sleep(1000);
} catch (interruptedexception e) {
e.printstacktrace();
}
system.out.println(“synchronizedmethod1 done”);
}
public void method1() {
system.out.println(“method 1 called”);
try {
thread.sleep(1000);
} catch (interruptedexception e) {
e.printstacktrace();
}
system.out.println(“method 1 done”);
}
}
public class mythread extends thread {
private int id = 0;
private common common;
public mythread(string name, int no, common object) {
super(name);
common = object;
id = no;
}
public void run() {
system.out.println(“running thread” + this.getname());
try {
if (id == 0) {
common.synchronizedmethod1();
} else {
common.method1();
}
} catch (exception e) {
e.printstacktrace();
}
}
public static void main(string[] args) {
common c = new common();
mythread t1 = new mythread(“mythread-1”, 0, c);
mythread t2 = new mythread(“mythread-2”, 1, c);
t1.start();
t2.start();
}
}
这里是程序的输出:
running threadmythread-1
synchronizedmethod1 called
running threadmythread-2
method 1 called
synchronizedmethod1 done
method 1 done
结果表明即使synchronizedmethod1()方法执行了,method1()也会被调用。
9、在一个对象上两个线程可以调用两个不同的同步实例方法吗?
不能,因为一个对象已经同步了实例方法,线程获取了对象的对象锁。所以只有执行完该方法释放对象锁后才能执行其它同步方法。看下面代码示例非常清晰:common 类 有synchronizedmethod1()和synchronizedmethod2()方法,mythread调用这两个方法。
public class common {
public synchronized void synchronizedmethod1() {
system.out.println(“synchronizedmethod1 called”);
try {
thread.sleep(1000);
} catch (interruptedexception e) {
e.printstacktrace();
}
system.out.println(“synchronizedmethod1 done”);
}
public synchronized void synchronizedmethod2() {
system.out.println(“synchronizedmethod2 called”);
try {
thread.sleep(1000);
} catch (interruptedexception e) {
e.printstacktrace();
}
system.out.println(“synchronizedmethod2 done”);
}
}
public class mythread extends thread {
private int id = 0;
private common common;
public mythread(string name, int no, common object) {
super(name);
common = object;
id = no;
}
public void run() {
system.out.println(“running thread” + this.getname());
try {
if (id == 0) {
common.synchronizedmethod1();
} else {
common.synchronizedmethod2();
}
} catch (exception e) {
e.printstacktrace();
}
}
public static void main(string[] args) {
common c = new common();
mythread t1 = new mythread(“mythread-1”, 0, c);
mythread t2 = new mythread(“mythread-2”, 1, c);
t1.start();
t2.start();
}
}
10、什么是死锁
死锁就是两个或两个以上的线程被无限的阻塞,线程之间相互等待所需资源。这种情况可能发生在当两个线程尝试获取其它资源的锁,而每个线程又陷入无限等待其它资源锁的释放,除非一个用户进程被终止。就javaapi而言,线程死锁可能发生在一下情况。
●当两个线程相互调用thread.join()
●当两个线程使用嵌套的同步块,一个线程占用了另外一个线程必需的锁,互相等待时被阻塞就有可能出现死锁。
11、什么是线程饿死,什么是活锁?
线程饿死和活锁虽然不想是死锁一样的常见问题,但是对于并发编程的设计者来说就像一次邂逅一样。
当所有线程阻塞,或者由于需要的资源无效而不能处理,不存在非阻塞线程使资源可用。javaapi中线程活锁可能发生在以下情形:
●当所有线程在程序中执行object.wait(0),参数为0的wait方法。程序将发生活锁直到在相应的对象上有线程调用object.notify()或者object.notifyall()。
●当所有线程卡在无限循环中。
篇2:Java程序员面试中的多线程问题
Java程序员面试中的多线程问题
0、Java中多线程同步是什么?
在多线程程序下,同步能控制对共享资源的访问,如果没有同步,当一个Java线程在修改一个共享变量时,另外一个线程正在使用或者更新同一个变量,这样容易导致程序出现错误的结果。
1、解释实现多线程的几种方法?
一Java线程可以实现Runnable接口或者继承Thread类来实现,当你打算多重继承时,优先选择实现Runnable。
2、Thread.start()与Thread.run()有什么区别?
Thread.start()方法(native)启动线程,使之进入就绪状态,当cpu分配时间该线程时,由JVM调度执行run()方法。
3、为什么需要run()和start()方法,我们可以只用run()方法来完成任务吗?
我们需要run()&start()这两个方法是因为JVM创建一个单独的线程不同于普通方法的调用,所以这项工作由线程的start方法来完成,start由本地方法实现,需要显示地被调用,使用这俩个方法的另外一个好处是任何一个对象都可以作为线程运行,只要实现了Runnable接口,这就避免因继承了Thread类而造成的`Java的多继承问题。
4、什么是ThreadLocal类,怎么使用它?
ThreadLocal是一个线程级别的局部变量,并非“本地线程”。ThreadLocal为每个使用该变量的线程提供了一个独立的变量副本,每个线程修改副本时不影响其它线程对象的副本(译者注)。
下面是线程局部变量(ThreadLocal variables)的关键点:
一个线程局部变量(ThreadLocal variables)为每个线程方便地提供了一个单独的变量。
ThreadLocal实例通常作为静态的私有的(private static)字段出现在一个类中,这个类用来关联一个线程。
当多个线程访问ThreadLocal实例时,每个线程维护ThreadLocal提供的独立的变量副本。
常用的使用可在DAO模式中见到,当DAO类作为一个单例类时,数据库链接(connection)被每一个线程独立的维护,互不影响。(基于线程的单例)
5、什么时候抛出InvalidMonitorStateException异常,为什么?
调用wait()/notify()/notifyAll()中的任何一个方法时,如果当前线程没有获得该对象的锁,那么就会抛出IllegalMonitorStateException的异常(也就是说程序在没有执行对象的任何同步块或者同步方法时,仍然尝试调用wait()/notify()/notifyAll()时)。由于该异常是RuntimeExcpetion的子类,所以该异常不一定要捕获(尽管你可以捕获只要你愿意).作为RuntimeException,此类异常不会在wait(),notify(),notifyAll()的方法签名提及。
6、Sleep()、suspend()和wait()之间有什么区别?
Thread.sleep()使当前线程在指定的时间处于“非运行”(Not Runnable)状态。线程一直持有对象的监视器。比如一个线程当前在一个同步块或同步方法中,其它线程不能进入该块或方法中。如果另一线程调用了 interrupt()方法,它将唤醒那个“睡眠的”线程。
注意:sleep()是一个静态方法。这意味着只对当前线程有效,一个常见的错误是调用t.sleep(),(这里的t是一个不同于当前线程的线程)。即便是执行t.sleep(),也是当前线程进入睡眠,而不是t线程。t.suspend()是过时的方法,使用suspend()导致线程进入停滞状态,该线程会一直持有对象的监视器,suspend()容易引起死锁问题。
object.wait()使当前线程出于“不可运行”状态,和sleep()不同的是wait是object的方法而不是thread。调用 object.wait()时,线程先要获取这个对象的对象锁,当前线程必须在锁对象保持同步,把当前线程添加到等待队列中,随后另一线程可以同步同一个对象锁来调用object.notify(),这样将唤醒原来等待中的线程,然后释放该锁。基本上wait()/notify()与sleep() /interrupt()类似,只是前者需要获取对象锁,
7、在静态方法上使用同步时会发生什么事?
同步静态方法时会获取该类的“Class”对象,所以当一个线程进入同步的静态方法中时,线程监视器获取类本身的对象锁,其它线程不能进入这个类的任何静态同步方法。它不像实例方法,因为多个线程可以同时访问不同实例同步实例方法。
8、当一个同步方法已经执行,线程能够调用对象上的非同步实例方法吗?
可以,一个非同步方法总是可以被调用而不会有任何问题。实际上,Java没有为非同步方法做任何检查,锁对象仅仅在同步方法或者同步代码块中检查。如果一个方法没有声明为同步,即使你在使用共享数据Java照样会调用,而不会做检查是否安全,所以在这种情况下要特别小心。一个方法是否声明为同步取决于临界区访问(critial section access),如果方法不访问临界区(共享资源或者数据结构)就没必要声明为同步的。
下面有一个示例说明:Common类有两个方法synchronizedMethod1()和method1(),MyThread类在独立的线程中调用这两个方法。
public class Common {
public synchronized void synchronizedMethod1() {
System.out.println(“synchronizedMethod1 called”);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(“synchronizedMethod1 done”);
}
public void method1() {
System.out.println(“Method 1 called”);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(“Method 1 done”);
}
}
public class MyThread extends Thread {
private int id = 0;
private Common common;
public MyThread(String name, int no, Common object) {
super(name);
common = object;
id = no;
}
public void run() {
System.out.println(“Running Thread” + this.getName());
try {
if (id == 0) {
common.synchronizedMethod1();
} else {
common.method1();
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Common c = new Common();
MyThread t1 = new MyThread(“MyThread-1”, 0, c);
MyThread t2 = new MyThread(“MyThread-2”, 1, c);
t1.start();
t2.start();
}
}
这里是程序的输出:
篇3:java程序员面试问题
1、谈谈final, finally, finalize的区别。
final―修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract的,又被声明为final的。将变量或方法声明为final,可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,不能重载
finally―再异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。
finalize―方法名。Java 技术允许使用 finalize 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。
2、Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)?
匿名的内部类是没有名字的内部类。不能extends(继承) 其它类,但一个内部类可以作为一个接口,由另一个内部类实现。
3、Static Nested Class 和 Inner Class的不同,说得越多越好(面试题有的很笼统)。
Nested Class (一般是C++的说法),Inner Class (一般是JAVA的说法)。Java内部类与C++嵌套类最大的不同就在于是否有指向外部的引用上。具体可见http: //www.frontfree.net/articles/services/view.asp?id=704&page=1
注: 静态内部类(Inner Class)意味着1创建一个static内部类的对象,不需要一个外部类对象,2不能从一个static内部类的一个对象访问一个外部类对象
Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现
HashMap允许将null作为一个entry的key或者value,而Hashtable不允许
还有就是,HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法容易让人引起误解。
最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在
多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap
就必须为之提供外同步。
4、&和&&的区别。
&是位运算符。&&是布尔逻辑运算符。
5、HashMap和Hashtable的区别。
都属于Map接口的类,实现了将惟一键映射到特定的值上。
HashMap 类没有分类或者排序。它允许一个 null 键和多个 null 值。
Hashtable 类似于 HashMap,但是不允许 null 键和 null 值。它也比 HashMap 慢,因为它是同步的。
Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现
还有就是,HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法容易让人引起误解。
最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在
多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap
就必须为之提供外同步。
6、Collection 和 Collections的区别。
Collections是个java.util下的类,它包含有各种有关集合操作的静态方法。
Collection是个java.util下的接口,它是各种集合结构的父接口.
7、什么时候用assert。
断言是一个包含布尔表达式的语句,在执行这个语句时假定该表达式为 true。如果表达式计算为 false,那么系统会报告一个 AssertionError。它用于调试目的:
assert(a >0); // throws an AssertionError if a <= 0
断言可以有两种形式:
assert Expression1 ;
assert Expression1 : Expression2 ;
Expression1 应该总是产生一个布尔值。
Expression2 可以是得出一个值的任意表达式。这个值用于生成显示更多调试信息的 String 消息。
断言在默认情况下是禁用的。要在编译时启用断言,需要使用 source 1.4 标记:
javac -source 1.4 Test.java
要在运行时启用断言,可使用 -enableassertions 或者 -ea 标记。
要在运行时选择禁用断言,可使用 -da 或者 -disableassertions 标记。
要系统类中启用断言,可使用 -esa 或者 -dsa 标记。还可以在包的基础上启用或者禁用断言。
可以在预计正常情况下不会到达的任何位置上放置断言。断言可以用于验证传递给私有方法的参数。不过,断言不应该用于验证传递给公有方法的参数,因为不管是否启用了断言,公有方法都必须检查其参数。不过,既可以在公有方法中,也可以在非公有方法中利用断言测试后置条件。另外,断言不应该以任何方式改变程序的状态。
8、GC是什么? 为什么要有GC? (基础)。
GC是垃圾收集器。Java 程序员不用担心内存管理,因为垃圾收集器会自动进行管理。要请求垃圾收集,可以调用下面的方法之一:
System.gc()
Runtime.getRuntime().gc()
9、String s = new String(“xyz”);创建了几个String Object?
两个对象,一个是“xyx”,一个是指向“xyx”的引用对象s。
10、Math.round(11.5)等于多少? Math.round(-11.5)等于多少?
Math.round(11.5)返回(long)12,Math.round(-11.5)返回(long)-11;
11、short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
short s1 = 1; s1 = s1 + 1;有错,s1是short型,s1+1是int型,不能显式转化为short型。可修改为s1 =(short)(s1 + 1) 。short s1 = 1; s1 += 1正确。
12、sleep() 和 wait() 有什么区别? 搞线程的最爱
sleep()方法是使线程停止一段时间的方法。在sleep 时间间隔期满后,线程不一定立即恢复执行。这是因为在那个时刻,其它线程可能正在运行而且没有被调度为放弃执行,除非(a)“醒来”的线程具有更高的优先级
(b)正在运行的线程因为其它原因而阻塞。
wait()是线程交互时,如果线程对一个同步对象x 发出一个wait()调用,该线程会暂停执行,被调对象进入等待状态,直到被唤醒或等待时间到。
13、Java有没有goto?
Goto―java中的保留字,现在没有在java中使用。
14、数组有没有length()这个方法? String有没有length()这个方法?
数组没有length()这个方法,有length的属性。
String有有length()这个方法。
15、Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?
方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。Overloaded的方法是可以改变返回值的类型。
16、Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?
Set里的元素是不能重复的,那么用iterator()方法来区分重复与否。equals()是判读两个Set是否相等。
equals()和==方法决定引用值是否指向同一对象equals()在类中被覆盖,为的是当两个分离的对象的内容和类型相配的话,返回真值。
17、给我一个你最常见到的runtime exception。
ArithmeticException, ArrayStoreException, BufferOverflowException, BufferUnderflowException, CannotRedoException, CannotUndoException, ClassCastException, CMMException, ConcurrentModificationException, DOMException, EmptyStackException, IllegalArgumentException, IllegalMonitorStateException, IllegalPathStateException, IllegalStateException,
ImagingOpException, IndexOutOfBoundsException, MissingResourceException, NegativeArraySizeException, NoSuchElementException, NullPointerException, ProfileDataException, ProviderException, RasterFormatException, SecurityException, SystemException, UndeclaredThrowableException, UnmodifiableSetException, UnsupportedOperationException
18、error和exception有什么区别?
error 表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况。
exception 表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况。
19、List, Set, Map是否继承自Collection接口?
List,Set是
Map不是
20、abstract class和interface有什么区别?
声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。
接口(interface)是抽象类的变体。在接口中,所有方法都是抽象的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽象的,没有一个有程序体。接口只可以定义static final成员变量。接口的实现与
[java程序员面试问题]
篇4:Java多线程常见面试问题及解答
Java多线程常见面试问题及解答
问题:进程和线程的区别
解答:一个进程对应一个程序的执行,而一个线程则是进程执行过程中的一个单独的执行序列,一个进程可以包含多个线程,线程有时候也被称为轻量级进程.
一个Java虚拟机的实例运行在一个单独的进程中,不同的线程共享Java虚拟机进程所属的堆内存。这也是为什么不同的线程可以访问同一个对象。线 程彼此共享堆内存并保有他们自己独自的栈空间。这也是为什么当一个线程调用一个方法时,他的.局部变量可以保证线程安全。但堆内存并不是线程安全的,必须通 过显示的声明同步来确保线程安全。
问题:列举几种不同的创建线程的方法.
解答:可以通过如下几种方式:
• 继承Thread 类
• 实现Runnable 接口
• 使用Executor framework (这会创建一个线程池)
class
Counter
extends
Thread {
//method where the thread execution will start
public
void
run(){
//logic to execute in a thread
}
//let’s see how to start the threads
public
static
void
main(String[] args){
Thread t1 =
new
Counter();
Thread t2 =
new
Counter();
t1.start();
//start the first thread. This calls the run() method.
t2.start();
//this starts the 2nd thread. This calls the run() method.
}
}
123456789101112131415class
Counter
extends
Base
implements
Runnable{
//method where the thread execution will start
public
void
run(){
//logic to execute in a thread
}
//let us see how to start the threads
public
static
void
main(String[] args){
Thread t1 =
new
Thread(
new
Counter());
Thread t2 =
new
Thread(
new
Counter());
t1.start();
//start the first thread. This calls the run() method.
t2.start();
//this starts the 2nd thread. This calls the run() method.
}
}
通过线程池来创建更有效率,
问题:推荐通过哪种方式创建线程,为什么?
解答:最好使用Runnable接口,这样你的类就不必继承Thread类,不然当你需要多重继承的时候,你将 一筹莫展(我们都知道Java中的类只能继承自一个类,但可以同时实现多个接口)。在上面的例子中,因为我们要继承Base类,所以实现Runnable 接口成了显而易见的选择。同时你也要注意到在不同的例子中,线程是如何启动的。按照面向对象的方法论,你应该只在希望改变父类的行为的时候才去继承他。通 过实现Runnable接口来代替继承Thread类可以告诉使用者Counter是Base类型的一个对象,并会作为线程执行。
问题:简要的说明一下高级线程状态.
解答:下图说明了线程的各种状态.
•可执行(Runnable):当调用start()方法后,一个线程变为可执行状态,但是并不意味着他会立刻开始真正地执行。而是被放入线程池,
篇5:如何面试java程序员
如何面试java程序员
JAVA面试经典问题:Java程序的基本结构
Java语言区分大小写吗?
区分,不管是数据还是标识符或者关键字都区分大小写,例如public不能写成Public, “abc”不能写成”ABC”,int i不能写成INT I等等,
main方法是作什么用处的?
这是程序的入口方法,是由虚拟机自动调用的。
语句必须用分号结束吗?
必须的,但是代码块{}可以用分号结束,也可以不用分号结束
Java中有几种注释,各自的功能
有三种:
单行注释//:加在行首只能注释一行
多行注释/* */:注释多行,但不能嵌套使用
文档注释/** */:用于生成HTML形式的文档,需要配合javadoc命令实现
Java语言的数据类型是强类型还是弱类型?
是强类型,意味着每一个变量都必须明确声明数据类型。
Java语言中数据类型的划分?有什么区别?
分成基本类型和引用类型两大类,
基本类型:有8种,只能存储单一的值,不以对象的形式存在
引用类型:除了基本类型之外其他的都是引用类型,能够存储复杂数据类型,以对象的'形式存在
基本类型都有哪8种类型?
布尔类型:boolean 占1字节
字符类型:char 占2字节
整型:byte 占1字节 short 占2字节 int 占4字节 long 占8字节
浮点型:float 占4字节 double 占8字节
布尔值可不可以用0或者非0数代替?
不可以,布尔值只能是true和false,不能使用数字,这和C语言是不一样的。
直接写个整数10默认是什么类型的?
整型的直接量例如10,100等默认的数据类型都是int型
如何让一个整型的直接量变成long型的?
在直接量后面加大写L后者小写l,例如10L
整型数据在程序中直接使用可以使用什么进制?
10进制
,8进制
,16进制
,但不能使用二进制
浮点运算在Java中有没有误差?
有误差,所以精密运算请使用BigDecimal类
直接写一个3.14的直接量是什么数据类型的?
篇6:java程序员面试自我介绍
java程序员应试者应充分利用各种个人资源,想了解java程序员面试指南?除了前面提到的应试者面带微笑、目光交流、坐姿端正等表情、身体语言外,请以沉稳平静的声音、以中等语速、以清晰的吐字发音、以开朗响亮的声调给考官以愉悦的听觉享受,声音小而模糊、吞吞吐吐的人,一定是胆怯、紧张、不自信和缺乏活力与感染力的。面试中java程序员自我介绍的重要性:通过自我介绍,主动地向面试考官推荐自己,这是面试组成结构的重要内容,同时也是面试测评的重要指标。下面一起来透视java程序员面试指南,java程序员自我介绍。
java程序员面试指南--实力是关键
可以分为实际操作的能力和理论上的知识。虽然上机很少,但是毫无疑问的是,如果你在IDE下很强,那么你就有很强的自信。有自信不一定行,但没有自信一定不行,我想大多数人都是这样认为的吧!理论的东西你可以花点时间系统的研究一下,不过如何才算系统呢?我也不知道,我是把《java2核心技术》看了两遍。
java程序员面试指南--态度是成功的催化剂
态度说穿了就是面试技巧问题,你的实际态度不重要,重要的是如何让他认为你态度不错,是个“知书达理”的好孩子。将来是否好管理是老板一类的人最在意的。
java程序员面试指南--经验是能力体现
这个没有什么好说的,一般来说经验越多,能力越强。如果他要求的工资不高的话,当然优先啦!小公司通常都是这么想的。
java程序员面试指南--运气也需要
我有同学,大学毕业之后在广州找了两个月没有找到工作,主要原因一是基础差点,加上没有经验,笔试,面试都过不去。偏偏有一次他去应聘,笔试答完之后,本来是技术员给他面试的,经理刚好过来。就问了他是哪里人,大学有没有补考之类的问题,五分钟之后就让他下个星期过来上班,月薪2500。后来他了解了一下,经理录用他的理由很简单,我同学是安徽人,经理接触过的安徽人给他的印象很好,什么踏实,肯干,任劳任怨。总之就是安徽人有优先权。不过我怎么感觉主要的理由是“比较听话”。
java程序员自我介绍--报出自己的姓名和身份
可能应试者与面试考官打招呼时,已经将此告诉了对方,而且考官们完全可以从你的.报名表、简历等材料中了解这些情况,但仍请你主动提及。这是礼貌的需要,还可以加深考官对你的印象。
java程序员自我介绍-- 简单地介绍一下你的学历、工作经历等基本个人情况
请提供给考官关于你个人情况的基本的、完整的信息,如:学历、工作经历、家庭概况、兴趣爱好、理想与报负等。 这部分的陈述务必简明扼要、抓住要点。例如介绍自己的学历,一般只需谈本专科以上的学历。工作单位如果多,选几个有代表性的或者你认为重要的介绍,就可以了,但这些内容一定要和面试及应考职位有关系,
请保证叙述的线索清晰,一个结构混乱、内容过长的开场自,会给考官们留下杂乱无章、个性不清晰的印象,并且让考官倦怠,削弱对继续进行的面试的兴趣和注意力。
应试者还要注意这部份内容应与个人简历、报名材料上的有关内容相一致,不要有出入。在介绍这些内容时,应避免书面语言的严整与拘束,而使用灵活的口头语进行组织。这些个人基本情况的介绍没有对或错的问题——都属于中性问题,但如果因此而大意就不妥了。
java程序员自我介绍-- 以经验来说明自己的能力
接下来由这部份个人基本情况,自然地过渡到一两个自己本科或工作期间圆满完成的事件,以这一两个例子来形象地、明晰他说明自己的经验与能力,例如:在学校担任学生干部时成功组织的活动;或者如何投入到社会实践中,利用自己的专长为社会公众服务;或者自己在专业上取得的重要成绩以及出色的学术成就。
java程序员自我介绍--说明应聘该职位的原因
接下来要着重结合你的职业理想说明你应考这个公务员职位的原因,这一点相当重要。你可以谈你对应考单位或职务的认识了解,说明你选择这个单位或职务的强烈愿望。原先有工作单位的应试者应解释清楚自己放弃原来的工作而做出新的职业选择的原因。你还可以谈如果你被录取,那么你将怎样尽职尽责地工作,并不断根据需要完善和发展自己。当然这些都应密切联系你的价值观与职业观。不过,如果你将自己描述为不食人间烟火的、不计较个人利益的“圣人”,那么考官们对你的求职动机的信任,就要大打折扣了。
对于 java程序员自我介绍,这里我们介绍了一条清晰的线索,便于你组织你的自我介绍。为了保证结构明确,有条条有理,你可以多用短句子以便于口语表述,并且在段与段之间使用过渡句子,口语也要注意思路、叙述语言的流畅,尽量避免颠三倒四,同一句话反复说几遍的“粘糊劲,同时不要用过于随便的表述。而在java程序员面试指南里建议读者不要表示将来踏上工作岗位,将“一定要……“绝对……诸如此类的保证,似乎在做就职演讲。 这些例子很多画蛇添足似的自我介绍不但不会为你的形象增添色彩,会“越抹越黑”!。
范文参考:
我叫XXX,今年21岁,毕业于XX解放军信息工程大学计算机科学与技术专业,拥有扎实的Core Java基础,良好的编程风格;熟悉JSP+Servlet+JavaBean模式的WEB开发;熟悉Struts,Hibernate,Spring等开源框架,了解EJB; 熟悉Tomcat,Jboss服务器等,熟悉基于Linux及Unix环境下的软件开发。
在校期间有多次社会实践经历,曾参与过学院网上虚拟实验室开发的需求分析,大学期间多次担任多课程的课代表。虽然实际工作经验不是很足,但军校四年培养了我充分的自信心和敬业精神以及扎实的学科基础知识和较强的专业技能,四年军校生活中,我严格要求自己,自觉、遵纪、守时。本人坦诚且有责任心,有独立进取的品性,勤于动手、善于动脑,适应新环境能力很强。能在最短时间内完成从学生到职业工作人员的转型,尽自己最大的努力融入新的工作生活。
请各位考官多多指教,谢谢!
篇7:java程序员面试葵花宝典
人们常说:机会总是留给有准备的人。作为一个炙手可热的java程序员,在求职之前,一定要明确自己的求职态度,熟悉求职的过程,做好充分的准备,把一些可预见的事情做好。这样在招聘的时候才能充满自信,处变不惊。求职过程中,有些事情是无法预料的,这些事情可能会打乱求职者的心态,影响求职的结果。如果应聘者能够尽早把准备工作做好,即便发生了一些意料之外的事情,也不会有太大的影响,把事态控制在自己所能控制的范围之内。
以下就是笔者总结的作为一个计算机相关专业的应届毕业生或有志于从事软件开发的人员,应该如何摆正自己的心态,以及一些在求职过程中应该注意的问题。
认识职业规划
大部分程序员都是在职场中不断地遇到挫折、漫无目的地跳槽后,才对自己的职业发展方向产生了疑惑。合理地规划自己的职业生涯是非常有必要,也是非常有意义的事,对于任何人,完善的职业生涯规划都能让自己有一个目标和方向,然后向着这个目标前进。
职业规划的意义 职业规划的意义是每一个初涉职场的人必须要了解的,下面是最重要的几点。
以既有的成就为基础,确立人生的方向,提供奋斗的策略,发掘自我潜能。
完善的职业生涯规划将使你正确认识自身的个性特质、现有与潜在的资源优势,帮助你重新对自己的价值进行定位并使其持续增值,并对自己的综合优势与劣势进行对比分析。还可以使你树立明确的职业发展目标与职业理想,客观评估个人目标与现实之间的差距,并可更敏锐地搜索或发现新的或有潜力的职业机会。并且,通过采用科学的方法付诸于实际行动,不断增强你的职业竞争力,即可实现自己的职业目标和理想。
可以重新安排自己的职业生涯,突破生活的格线,塑造清新充实的自我。
准确评价个人特点和强项,增强发展的目的性与计划性,提升成功的机会。
职业生涯的发展要有计划、有目的,不可盲目地“碰运气”。很多人在职场受挫就是由于生涯规划没有做好。好的计划是成功的开始,凡事“预则立,不预则废”就是这个道理。
评估个人目标和现状的差距。
职业生涯规划可以提升应对竞争的能力。
当今社会处在变革的时代,到处充满着激烈的竞争。物竞天择,适者生存。职业活动的竞争尤为突出,特别是我国加入WTO后,要在这场激烈的职场竞争中脱颖而出,并始终立于不败之地,必须设计好自己的职业生涯规划。做好个人的职业生涯发展规划后,在职业发展的道路上,会有很多因素影响着个人的职业发展,其中最重要的应当是自身对职业的选择。如何降低在职业上最大的风险也是个人职业规划需要考虑的问题。如满足于现状,不思进取这样的问题是要靠更新知识结构、转换思维模式来解决的。针对不同的阶段,本章将分别讲述应届毕业生的近期职业规划,以及在职程序员(或相关职业)的职业生涯规划。
软件人才的职业规划
软件行业所带来的职位不仅限于程序员,编码工作也只是软件开发的一部分。一个人从事软件行业,可以只涉及其中的一个方面,也可以涵盖多个方面。如何知道哪个或哪些类型的职位更适合自己呢?下面是在面试中的一些常见的软件人才职位。
程序员;
软件工程师;
系统分析师;
数据库架构师;
测试工程师;
项目经理。
在国内,新技术确实容易引起很多误会,甚至有的企业招聘时也盲目跟风,无论什么项目都只用Java或.NET开发,有的应届毕业生以为自己会Java或.NET即可走遍天下了。殊不知C++(本地代码程序)程序远比Java或.NET程序效率高,并且不需要安装运行环境,在某些有要求的项目中C++才是最好的选择。只有认清这些技术的各种细节,在职业生涯规划中才不会以编程语言或技术平台为主线进行设计,而应当依据个人所适合的技术进行深入,直至成为专家。
应聘过程
应聘过程是十分曲折的,任何一个环节出现问题都会导致应聘的失败。求职者应该对每一个求职环节都掌握于心,做好充分的准备,才能有的放矢,灵活应对应聘过程中出现的每一个问题。
掌握基本的应聘流程
既然是求职应聘,肯定得先找到一个公司,找到一个适合自己的职位了。现在应聘的渠道也比较多,对于IT技术职位的应聘来说,比较常见的有校园招聘、招聘网站、社会招聘会、专题招聘会等形式。
对于应届毕业生来说,校园招聘会更适合他们。因为他们一般没有什么工作经验,校园招聘也不会要求他们有工作经验,而社会招聘往往会设置一个工作经验的门槛。一些公司在每年年底的时候,会到校园去进行宣讲会,应届毕业生在这个时候去求职是再适合不过的了。
目前,招聘网站也是一个比较流行和重要的招聘信息来源。一些大型的软件公司也会在招聘网上,例如智联招聘、中华英才网等,发布他们的职位需求信息。此时,求职者投递的就是电子简历了,它相对于纸张的简历来说,亲切感要差一些。
另外,每年年初是跳槽的高峰时期,各大城市都会组织大型的招聘会,或者专题招聘会,应届毕业生和社会求职者都可以到这些招聘会上找适合自己的公司及其职位,通过面对面的交流,充分了解公司的情况和职位的情况。
通过各种渠道找到自己心仪的公司和职位以后,就可以开始去应聘了。
面试资料的准备 无论是应届毕业生还是有过工作经验的应聘者,在面试前都要准备充足的各种资料。这些资料一般包括以下几种。
作品
对于技术设计类的工作岗位,具体的作品是最重要的资料,也是用人企业最看重的东西。应届毕业生不要以为没有工作经验而不准备具体的作品。例如,应聘者所应聘的工作岗位是“Web开发人员”,应试者要事先了解该岗位对Web开发的技术要求,然后根据要求准备自己的作品资料。即便是应届毕业生也可以准备自己的作品资料,如网站后台方面的课程设计,如果有必要还可将其修改为完整的项目
通过应试者对自己作品的讲解(如源代码),用人企业可以直接了解应试者的技术能力,避免了各种测试所走的弯路。很多小规模的公司往往跳过了笔试步骤,直接通过应试者的作品来判断其能力是否适合工作岗位。
证书
由于个人简历中一般都会注明自己所获得的各种证书,很多用人企业筛选简历的依据也有证书的因素。所以应试者最好带上证书的原件,如学历证、学位证、英语等级证、程序员等级证等。由于应届毕业生没有工作经验,所以证书的作用相对比较大,而有过工作经验的反而不需要太多的证书来证明自己。
个人简历
虽然用人企业已经浏览过应试者的简历,但在实际中,用人企业仍然有可能会让应试者重新填写一份简历。对于很多应试者,重新填写简历时部分内容可能会与原来的有出入,所以应试者最好带上一份原始简历。
简历的写法及应注意的问题 简历是求职者信息的一个概况,是招聘者对求职者的情况了解的第一来源。它的重要性是不言而喻的。而事实上,大多数的简历都是不合格的。许多管理者都会抱怨简历很糟糕。那么应该如何让自己的简历做到简洁明了,在充分展示自己的同时又不显得冗余呢?其实,求职者在写简历时应该注意以下几点。
招聘单位看简历,肯定是要看一个真实的求职者。求职者应该完全如实地把信息表达出来,不可以包含任何的虚假信息。这些虚假信息对求职者是没有任何帮助的。即使它们为求职赢得了一次面试机会,也会在面试时露出马脚,使得招聘者更加反感。为人真诚是一个基本的做人原则,它反映了一个人的基本素质。
[java程序员面试葵花宝典]
★ 面试中经典问题
★ 程序员如何面试
Java程序员面试中的多线程问题(共7篇)




