Java抱佛脚做练习(一)

1.创建两个线程,与主线程交替运行,输出1-60的数字,并显示每个线程的名称

public class Test6 implements Runnable {
    @Override
    public void run() {
        for(int i=1;i<61;i++){
            System.out.println(Thread.currentThread().getName()+"--------"+i);
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    public static void main(String[] args) {
        Test6 td = new Test6();
        Thread t1 = new Thread(td,"线程1");
        Thread t2 = new Thread(td,"线程2");
        t1.start();
        t2.start();
        for(int i=1;i<61;i++) {
            System.out.println(Thread.currentThread().getName() + "-"+i);
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

Thread.currentThread():
(参考:https://www.cnblogs.com/FlyAway2013/p/7527916.html
Thread.currentThread() 返回的是 一个实例。 只不过呢, 这个实例确实比较特殊。 这个实例是当前Thread 的引用。

Thread.currentThread()与this的区别
在线程的run 方法内部, Thread.currentThread()与this 其实是一个意思(除非你手动执行run方法,而不是通过启动线程的方式)。 不过呢, 其他的某些方法或场合,却可能出现不一致。
一般来说,Thread.currentThread() 用于不方便使用this 的场合。 Thread.currentThread() 明确表明了它所针对的对象是 当前线程! 不是this! 当然,如果碰巧this 就是当前线程, 那也是没毛病的。

Thread.sleep()
(参考:https://blog.csdn.net/Weixiaohuai/article/details/83994146

Thread.sleep()是Thread类的一个静态方法,使当前线程休眠,进入阻塞状态(暂停执行),如果线程在睡眠状态被中断,将会抛出IterruptedException中断异常。。主要方法如下:
sleep(long millis) 线程睡眠 millis 毫秒
sleep(long millis, int nanos) 线程睡眠 millis 毫秒 + nanos 纳秒

Thread.start()
(参考:https://baijiahao.baidu.com/s?id=1624067920453033349&wfr=spider&for=pc

1.Java中的start()方法是什么?线程类的start()方法可以用来启动线程;该方法会在内部调用Runnable接口的run()方法,以在单独的线程中执行run()方法中指定的代码。start()方法启动线程执行以下任务:
1.1 它统计了一个新线程
1.2线程从New State移动到Runnable状态。
1.3 当线程有机会执行时,它的目标run()方法将运行。
2.Java中的run()方法是什么?线程类的run()方法是Runnable接口的一个抽象方法,由java虚拟机直接调用的,不会创建的新线程。

2.使用多线程,模拟龟兔赛跑的场景
(感觉跟第一题大同小异,不过多线程应该就考这么难)
(参考:https://blog.csdn.net/weixin_43895377/article/details/89923825

class RabbitAndTurtle extends Thread {
     public int distance = 100;
     static boolean flag = true;
     public int predistance = 0;
     @Override
     public void run() {
         double ran = Math.random();
         String name = Thread.currentThread().getName();
        while (flag){
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            if (name.equals("乌龟")) {
                if (Math.random() < 1) {
                    predistance += 1;
                    System.out.println(name + "我跑了:" + predistance + "米");
                    if (predistance == 100) {
                        System.out.println("=================乌龟赢了=================");
                        flag = false;
                        break;
                    }
                }
                try {
                    sleep(100);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            if (name.equals("兔子")) {
                if (Math.random() < 0.3) {
                    predistance += 2;
                    System.out.println(name + "我跑了:" + predistance + "米");
                    if (predistance == 100) {
                        System.out.println("=================兔子赢了=================");
                        flag = false;
                        break;
                    }
                }
            }
            try {
                sleep(200);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
     }
 }
public class Test3 {
    public static void main(String[] args) {
        Thread rabbit = new RabbitAndTurtle();
        Thread turtle = new RabbitAndTurtle();
        rabbit.setName("兔子");
        turtle.setName("乌龟");
        rabbit.start();
        turtle.start();
    }
}

(我动手能力好弱啊明明换汤不换药的题加一点内容我就不会了)

3.有如下Student 对象,
private String name;
private int age;
private int score;
private String classNum
;其中,classNum 表示学生的班号,例如“class05”。
有如下ListList list = new ArrayList();
list.add(new Student(“Tom”, 18, 100, “class05”));
list.add(new Student(“Jerry”, 22, 70, “class04”));
list.add(new Student(“Owen”, 25, 90, “class05”));
list.add(new Student(“Jim”, 30,80 , “class05”));
list.add(new Student(“Steve”, 28, 66, “class06”));
list.add(new Student(“Kevin”, 24, 100, “class04”));
在这个list 的基础上,完成下列要求:
1) 计算所有学生的平均年龄
2) 计算各个班级的平均分
3)把集合类型换成HashSet,如果名字和年龄相同就认为是同一个人。

import java.util.ArrayList;
import java.util.List;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import java.util.Objects;
 class Student  implements Comparable<Student> {
     String name;
     int age;
     int score;
    String classNum;
   public Student(String name, int age, int score, String classNum){
       this.name=name;
       this.age=age;
       this.score=score;
       this.classNum=classNum;
   }
   public String toString() {
       return "Student{" +
               "name='" + name + '\'' +
               ", age=" + age +
               ", score=" + score +
               ", classNum=" + classNum +
               '}';
   }
   public int hashCode() {
       return Objects.hash(name, age);
   }
   @Override
   public boolean equals(Object o) {
       if (this == o) return true;
       if (o == null || getClass() != o.getClass()) return false;
       Student student = (Student) o;
       return age == student.age &&
             Objects.equals(name, student.name);
   }
   @Override
   public int compareTo(Student o) {
       int num=o.name.compareTo(name);
       if(num==0){
           num=age-o.age;
       }
       return num;
   }
}
  public class Test1{
    public static void main(String[] args){
        List<Student> list=new ArrayList<>();
        list.add(new Student("Tom",18,100,"class05"));
        list.add(new Student("Jerry",22,70,"class04"));
        list.add(new Student("Owen",25,90,"class05"));
        list.add(new Student("Steve",30,80,"class05"));
        list.add(new Student("Kevin",28,66,"class06"));
        list.add(new Student("Tom",18,100,"class05"));
        //第一问
        int sum=0;
        for(Student stu:list){
            sum+=stu.age;
        }
        System.out.println("平均年龄是:"+sum/list.size());
        //第二问
        int sumscore04=0;
        int sumscore05=0;
        int sumscore06=0;
        int sumstu04=0;
        int sumstu05=0;
        int sumstu06=0;
        for(Student stu:list){
         if(stu.classNum.equals("class04")) {
          sumscore04+=stu.score;
          sumstu04++;
         }
         else if(stu.classNum.equals("class05")) {
          sumscore05+=stu.score;
          sumstu05++;
         }
         else if(stu.classNum.equals("class06")) {
          sumscore06+=stu.score;
          sumstu06++;
         }
        }
        System.out.println("四班平均分是:"+sumscore04/sumstu04);
     System.out.println("五班平均分是:"+sumscore05/sumstu05);
     System.out.println("六班平均分是:"+sumscore06/sumstu06);
       //第三问
    Set<Student> set1 = new HashSet<>();
    Student s1=new Student("Tom",18,100,"class05");
    Student s2=new Student("Jerry",22,70,"class04");
    Student s3=new Student("Owen",25,90,"class05");
    Student s4=new Student("Steve",30,80,"class05");
    Student s5=new Student("Kevin",28,66,"class06");
    Student s6=new Student("Tom",18,100,"class05");
    set1.add(s1);
    set1.add(s2);
    set1.add(s3);
    set1.add(s4);
    set1.add(s5);
    set1.add(s6);
    Iterator<Student> it = set1.iterator();
    while(it.hasNext()){
        System.out.println(it.next());
    }
    }
  }

输出:

平均年龄是:23
四班平均分是:70
五班平均分是:92
六班平均分是:66
Student{name='Jerry', age=22, score=70, classNum=class04}
Student{name='Tom', age=18, score=100, classNum=class05}
Student{name='Steve', age=30, score=80, classNum=class05}
Student{name='Owen', age=25, score=90, classNum=class05}
Student{name='Kevin', age=28, score=66, classNum=class06}

4、import java.util.*;
public class TestList{
public static void main(String args[]){
List list = new ArrayList();
list.add(“Hello”);
list.add(“World”);
list.add(1,“Learn”);
list.add(1,“Java”);
printList(list);
}
public static void printList(List list){
System.out.println(“方式一:”);
Iterator iterator = list.iterator();
//1 要求输出 list 中所有元素的内容
( )
System.out.println("\n方式二:");
for(String obj: list){
System.out.print(obj+" “);
}
System.out.println(”\n方式三:");
for(int i = 0; i < list.size(); i++){
System.out.print(list.get(i)+" ");
}
}}
要求:I. 把//1 处的代码补充完整,要求输出 list 中所有元素的内容
II. 写出程序执行的结果

import java.util.*;
public class Test1 {
 public static void main(String args[]){
     List<String> list = new ArrayList<String>();
     list.add("Hello");
     list.add("World");
     list.add(1,"Learn");
     list.add(1,"Java");
     printList(list);
 }
 public static void printList(List<String> list){
        System.out.println("方式一:");
     Iterator iterator = list.iterator();
  //1 要求输出 list 中所有元素的内容
   while(iterator.hasNext()) {
    System.out.print(iterator.next()+" ");
   }
     System.out.println("\n方式二:");
     for(String obj: list){
         System.out.print(obj+" ");
     }
     System.out.println("\n方式三:");
     for(int i = 0; i < list.size(); i++){
         System.out.print(list.get(i)+" ");
     }
 }
 }

输出:

方式一:
Hello Java Learn World 
方式二:
Hello Java Learn World 
方式三:
Hello Java Learn World 

5.(线程的创建)有以下代码
public class Example implements Runnable {
public void run() {
while(true) {
}
}
public static void main(String args[]) {
Example ex1 = new Example();
Example ex2 = new Example();
Example ex3 = new Example();
ex1.run();
ex2.run();
ex3.run();
}
}
选择正确答案:
A. 代码编译失败,因为ex2.run()无法获得执行
B. 代码编译成功,存在3 个可运行的线程
C. 代码编译成功,存在1 个可运行的线程
(这题不会)
问了老师,发现这题我稳稳地掉进陷阱
首先,这一题只有一个main线程,ex1.run()只是调用了run方法,线程的开启还是需要start,而且无论如何,请不要忘记main线程!
选C
(这题发现我对线程的理解还是应考,没有理解原理)

6、 (线程的创建)有以下代码
class Example implements Runnable {
public static void main(String args[]) {
Thread t = new Thread(new Example());
t.start();
}
public void run(int limit) {
for (int x = 0; x<limit; x++) {
System.out.println(x);
}
}
}
选择正确答案:
A. 打印输出,从0 至limit
B. 无内容输出,因为没有明确调用run()方法。
C. 代码编译失败,因为没有正确实现Runnable 接口
D. 代码编译失败,如果声明类为抽象类,可使代码编译成功。
E. 代码编译失败,如果去掉implements Runnable,可使代码编译成功。
选C
尝试了一下,的确编译通不过,我理解的原因是,由于定义类的时候实现了Runaanle接口,但是没有实现这个接口中的方法这个方法应该是run(),是不带参的。

7、(sleep 方法)有如下代码
class Example {
public static void main(String args[]) {
Thread.sleep(3000);
System.out.println(“sleep”);
}
}
选择正确答案:
A. 编译出错
B. 运行时异常
C. 正常编译运行,输出sleep
D. 正常编译运行,但没有内容输出
选A
在用sleep总伴随着异常抛出

try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

或者

throws InterruptedException

8、(线程的创建)有如下代码
class Example extends Thread {
public void run() {
System.out.println(“Running”);
System.out.println(“Done”);
}
private void xxx() {
System.out.println(“In xxx”);
}
public static void main(String args[]){
Example ttt = new Example();
ttt.start();
ttt.xxx();
}
}
以上代码是否会打印“In xxx”?

In xxx
Running
Done

(不要忘了主函数的线程!)
(我的理解是主函数中创建从线程,start()后调用run()方法,而主函数的线程调用写在主函数中的方法,这里的.xxx()方法被主函数调用;)

9、(线程的创建)创建两个线程,要求如下:
1) 一个线程输出100 个1~26,另一个线程输出100 个A~Z
2) 一个线程使用集成Thread 类的写法,另一个线程使用实现Runnable 接口的写法。

class T1 extends Thread  {
 String name=Thread.currentThread().getName();
      public void run() {
        for(int i=1;i<=100;i++) {
         for(int j=1;j<=26;j++) {
          System.out.println(j);
          try {
                      Thread.sleep(100);
                  } catch (InterruptedException e) {
                      e.printStackTrace();
                  }
         }
        } 
        }
      }
 class T2 implements Runnable{
  public void run(){
       for(int i=1;i<=100;i++) {
        for(char ss=65;ss<=90;ss++) {
         System.out.println((char)ss);
         try {
                     Thread.sleep(100);
                 } catch (InterruptedException e) {
                     e.printStackTrace();
                 }
        } 
  }
  }
 }
      public class Test6{
      public static void main(String[] args) {
       T1 xx=new T1();
       xx.name="线程1";
       T2 yy=new T2();
          Thread t2 = new Thread(yy,"线程2");
          xx.start();
          t2.start();     
      }
     }

(啊!我这凌乱的括号!)

  1. (线程状态)有如下代码
    class MyThread extends Thread{
    public void run(){
    for(int i = 0; i<100; i++){
    System.out.println(“$$$”);
    }
    }
    }public class TestMyThread{
    public static void main(String args[]){
    Thread t = new MyThread();
    t.start();
    t.start();
    t.start();
    }
    }选择正确答案:
    A. 编译出错
    B. 编译正常,运行时有错
    C. 编译运行都无错误,产生1 个线程
    D. 编译运行都无错误,产生3 个线程
Exception in thread "main" java.lang.IllegalThreadStateException
 at java.lang.Thread.start(Unknown Source)
 at Test7.main(Test7.java:17)
$$$
$$$
$$$
$$$
$$$
$$$

(多次start()同一个线程,导致出错)

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值