一、选择题
1.编译运行下面的代码会发生什么?
publicclass Test extends Thread{
publicstaticvoid main(String argv[]){
Testb = new Test();
b.run();
}
publicvoid start() {
for (inti = 0; i <10; i++){
System.out.println("Value of i = " + i);
}
}
}
A.编译错误,Thread类中的run方法没有定义
B.运行时错误,Thread类中的run方法没有定义
C.编译无错,打印0到9
D.编译无错,不打印任何值
2.编译运行下面的代码会发生什么?
publicclassAgg {
publicstaticvoid main(String argv[]) {
Agg a = new Agg();
a.go();
}
publicvoid go() {
DSRoss ds1 = new DSRoss("one");
ds1.start();
}
}
class DSRoss extends Thread {
private String sTname = "";
DSRoss(Strings) {
sTname = s;
}
publicvoidrun() {
notwait();
System.out.println("finished");
}
publicvoidnotwait() {
while (true) {
try {
System.out.println("waiting");
wait();
} catch (InterruptedException ie) {
}
System.out.println(sTname);
notifyAll();
}
}
}
A. 编译错误
B. 能够编译,输出“waiting"
C. 能够编译, 输出“waiting",紧接着输出"finish"
D.运行时错误,会抛异常
3.编译运行下面的代码会发生什么?
publicclassTest extendsThread {
private String sThreadName;
publicstaticvoid main(String argv[]) {
Test h = new Test();
h.go();
}
Test() {
}
Test(String s){
sThreadName = s;
}
publicString getThreadName() {
returnsThreadName;
}
publicvoidgo() {
Test first = new Test("first");
first.start();
Test second = new Test("second");
second.start();
}
publicvoidstart() {
for (inti = 0; i < 2; i++) {
System.out.println(getThreadName()+ i);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
System.out.println(e.getMessage());
}
}
}
}
A.编译错误
B.输出first0, second0, first1, second1.
C.输出first0, first1, second0, second1.
D.运行时错误
编译运行下面的代码会发生什么
publicclassTest {
publicstaticvoidmain(String argv[]){
Pmcraven pm1 = new Pmcraven("one");
pm1.run();
Pmcraven pm2 = new Pmcraven("two");
pm2.run();
}
}
class Pmcraven extends Thread {
privateString sTname= "";
Pmcraven(String s) {
sTname = s;
}
publicvoidrun() {
for (inti = 0; i < 2; i++) {
try {
sleep(1000);
} catch (InterruptedException e) {
}
yield();
System.out.println(sTname);
}
}
}
A.编译错误
B.输出One One Two Two
C.输出One Two One Two
D.输出One Two One Two
二、简单题
1 当一个线程进入到一个对象的synchronized方法,那么其他线程是否可以进入该对象的其它方法?
如果其它方法加了static关键字,那么该方法属于类,不属于对象,不能与对象的方法保持同步(即使有synchronized关键字),是能进入的。
如果其它方法不带有static关键字且带有synchronized关键字,那么不能进入,如果不带,则能。
2 sleep()和wait()有何异同?
1) wait是Object类的方法,而sleep()是Thread类的静态方法
2) sleep没有释放出锁,而wait释放了锁
3) wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用
4) sleep需要捕获异常,而wait不需要
三、编程题
1 现在有T1 T2 T3三个线程,怎样保证T2在T1执行完之后执行 T3在T2执行完之后执行。
public class JoinDemo{
public static void main(String[] args) {
T1 t1=new T1("T1");
T2 t2=new T2("T2");
T3 t3=new T3("T3");
t1.start();
try {
t1.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
t2.start();
try {
t2.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
t3.start();
}
}
class T1 extends Thread{
private String name;
public T1(String name) {
this.name=name;
}
@Override
public void run() {
for(int i=0;i<5;i++){
try {
sleep(5);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(this.name+"循环"+i);
}
}
}
class T2 extends Thread{
private String name;
public T2(String name) {
this.name=name;
}
@Override
public void run() {
for(int i=0;i<5;i++){
try {
sleep(5);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(this.name+"循环"+i);
}
}
}
class T3 extends Thread{
private String name;
public T3(String name) {
this.name=name;
}
@Override
public void run() {
for(int i=0;i<5;i++){
System.out.println(this.name+"循环"+i);
}
}
}
3 将 1到999999的加和平均分配到3个线程计算,然后再将加和的结果汇总。
publicclassTestVolatile {
publicstaticvoid main(String args[]){
M.Start();
System.out.println("Finnish!");
}
}
class M{
privatestaticvolatilelonga=0;
publicstaticvoid Start(){
Threadthread1=new Thread(new Runnable() {
publicvoid run() {
for(inti=1;i<333333;i++){
a+=i;
}
System.out.println(a);
}
});
Threadthread2=new Thread(new Runnable() {
publicvoid run() {
for(inti=3333333;i<666666;i++){
a+=i;
}
System.out.println(a);
}
});
Threadthread3=new Thread(new Runnable() {
publicvoid run() {
for(inti=6666666;i<1000000;i++){
a+=i;
}
System.out.println(a);
}
});
thread1.start();
thread2.start();
thread3.start();
}
}
4 使用主线程获取键盘输入,并写入1.txt文件,使用新线程从文件中读取内容,并在控制台打印出来(需用同步锁保证写文件操作,只有写完文件,才能读取文件)。
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;
publicclassTest extendsThread{
private File file = null;
publicstaticvoid main(String[] args){
Testt = new Test();
t.writeFile();
t.start();
}
publicvoid writeFile(){
file = new File("1.txt");
Scannernum= newScanner(System.in);
System.out.println("请输入要录入的内容:");
Stringb = num.nextLine();
BufferedWriterwriter;
synchronized(file){
try {
writer = new BufferedWriter(new FileWriter(file));
writer.write(b);
writer.flush();
writer.close();
}catch(IOException e) {
e.printStackTrace();
}
}
}
@Override
publicvoid run() {
try {
if(!file.exists()){
return;
}
BufferedReaderbr = new BufferedReader(new FileReader(file));
Strings = null;
while((s=br.readLine())!=null){
System.out.print(s);
}
br.close();
}catch(FileNotFoundException e) {
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}
}
}
答案是老师滴 我概不负责对错,,我只负责抄作业!