题目 1:分别使用ArrayList和LinkedList集合,编写一个模拟KTV点歌系统的
程序。在程序中,输入0代表添加歌曲,输入1代表将所选歌曲置顶,输
入2代表将所选歌曲前移一位,输入3代表退出该系统。
效果图如下:
代码:
public class KtvTest {
public static void main(String[] args) throws InterruptedException {
ArrayList<String> music = new ArrayList<String>();
music.add("晴天");
music.add("江南");
music.add("奇迹在线");
music.add("甜蜜蜜");
music.add("野区");
while (true){
System.out.println("-----------欢迎来到点歌系统-------------");
System.out.println("0.添加歌曲至列表");
System.out.println("1.将歌曲置顶");
System.out.println("2.将歌曲前移一位");
System.out.println("3.退出");
System.out.println("初始歌曲列表:" + music);
System.out.print("请输入要执行的操作序号:");
Scanner scanner = new Scanner(System.in);
int i = scanner.nextInt();
if (i == 0){
System.out.println("请输入你要添加的歌曲名称");
String musicName = scanner.next();
music.add(musicName);
System.out.println("插入成功,3秒后返回");
Thread.sleep(3000);
} else if (i == 1) {
System.out.println("请输入你要置顶的歌曲");
String musicName = scanner.next();
boolean t = music.contains(musicName);
int a = music.indexOf(musicName);
if (a == 0 || t == false){
System.out.println("你输入的歌曲已经是第一位了,或者没找到输入内容,3秒后返回");
}else {
music.remove(musicName);
music.add(0,musicName);
}
Thread.sleep(3000);
} else if (i == 2) {
System.out.println("请输入你要前移一位的歌曲:");
String musicName = scanner.next();
boolean t = music.contains(musicName);
int a = music.indexOf(musicName);
if (t == true && a != 0){
music.remove(musicName);
music.add(a -1 ,musicName);
}else {
System.out.println("没找到你输入的歌曲,或者已经是第一位了,3秒后返回");
}
Thread.sleep(3000);
} else if (i == 3) {
return;
}else {
System.out.println("你的输入有误请重新输入,3秒后返回");
Thread.sleep(3000);
}
}
}
}
题目 2:在题目1的基础上使用多线程来保证每一个模块的安全,当分线程出现问题时要求主线程能够持续运行。
代码:
public class KtvTestThread {
//创建一个静态的,共享的数组集合,它是线程安全的前提:共享数据
static ArrayList<String> sound = new ArrayList();
public static void main(String[] args) throws InterruptedException { //主线程阻塞和睡眠抛出的编译异常,目的是分线程运行时保证主线程不捣乱
//默认添加的歌曲,不进入循环否则会重复添加
sound.add("奇迹在线");
sound.add("夜空最亮的星");
sound.add("玛卡巴卡");
sound.add("晴天");
sound.add("星空");
//第一层循环保证可以重复输入,程序不会结束
while(true){
//点歌系统主体
System.out.println("-----------------欢迎来到点歌系统-----------------");
System.out.println("0.添加歌曲至列表");
System.out.println("1.将歌曲置顶");
System.out.println("2.将歌曲前移一位");
System.out.println("3.退出");
System.out.print("歌曲列表:");
//歌曲列表
System.out.println(sound);
System.out.print("请输入要执行的操作序号:");
//创建输入流并修复输入类型不匹配的异常
Scanner scanner = new Scanner(System.in);
boolean inputselect = false;
int i = 99;
//如果不输入正确的数据类型会一直重新输入,直到输入正确
while(! inputselect){
if (scanner.hasNextInt()){
i = scanner.nextInt();
inputselect = true;
}else {
System.out.print("请输入数字!重新输入:");
scanner.next();//只有scanner.next()才会清除输入流
}
}
//判断输入的数据
if (i == 0){
//创建线程
Thread thread = new Thread(){
//重写方法
@Override
public void run() {
synchronized (sound){ //同步监视器
System.out.println("请输入歌曲名");
String musicName = scanner.next();
sound.add(musicName);//在集合的最后插入
System.out.println("插入成功!3秒后返回");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
};
thread.start();
thread.join();
} else if (i == 1) {
Thread thread = new Thread(){
@Override
public void run() {
synchronized (sound){
System.out.println("请输入要置顶的歌曲");
String musicName = scanner.next();
if (sound.contains(musicName)){ //输入的内容判断是否存在
sound.remove(musicName);//存在就删除
sound.add(0,musicName);//在集合的开始插入
}else {
System.out.println("没找到你输入的歌曲,3秒后返回");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
}
};
thread.start();
thread.join();
} else if (i == 2) {
Thread thread = new Thread(){
@Override
public void run() {
synchronized (sound){
System.out.println("请输入要前移一位的歌曲");
String musicName = scanner.next();
if (sound.contains(musicName)){//输入的内容判断是否存在
int a = sound.indexOf(musicName);//如果存在就获得它的下标
if (a != 0){//如果下标不为0,为0前移一位会造成下标越界
sound.remove(musicName);//删除
sound.add(a-1,musicName);//下标-1重新放入
}else {
System.out.println("已经是第一位了,3秒后返回");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}else {
System.out.println("没找到你输入的歌曲,3秒后返回");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
}
};
thread.start();
thread.join();
} else if (i == 3) {
System.out.println("您已退出系统-----------------");
return; // 输入3退出系统
}else {
System.out.println("请输入合法的标号,3秒后返回");
Thread.sleep(3000);
}
}
}
}