1.每个月的月末(02:00:00)执行一次代码
2.模拟售票
3.用15个线程实现,求123456789之间±和100的表达式(11结果,)如果一个线程求出结果,立即告诉其他停止
4.编写程序:实现三个线程,运行输出A1 B2 C3 A4 B5 C6…
每个月的月末(02:00:00)执行一次代码
public class Test1 {
// 每个月的月末(02:00:00)执行一次代码
public static void main(String[] args) {
new Thread(() -> {
while (true){
try {
// TimeUnit.SECONDS.sleep(5);
// TimeUnit.DAYS.sleep(30);
var c = Calendar.getInstance();
// System.out.println(c.get(Calendar.MONTH) + 1);
c.set(Calendar.MONTH,c.get(Calendar.MONTH) + 1);
c.set(Calendar.DAY_OF_MONTH,0);
c.set(Calendar.HOUR_OF_DAY,2);
c.set(Calendar.MINUTE,0);
c.set(Calendar.SECOND,0);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// System.out.println(sdf.format(c.getTime()));
if (c.getTimeInMillis() == System.currentTimeMillis()) {
// 每月的月末,要执行的代码
System.out.println(sdf.format(c.getTime()));
System.out.printf("%1$tF %1$tT%n", System.currentTimeMillis());
// ---------------------每月的月末,要执行的代码
TimeUnit.SECONDS.sleep(2);
}
// System.out.printf("%1$tF %1$tT%n",System.currentTimeMillis());
} catch (Exception e){
e.printStackTrace();
}
}
}).start();
}
}
public class Test1_1 {
// 每个月的月末(02:00:00)执行一次代码
public static void main(String[] args) {
new Thread(() -> {
long start = System.currentTimeMillis();
var c = Calendar.getInstance();
c.set(Calendar.MONTH,c.get(Calendar.MONTH) + 1);
c.set(Calendar.DAY_OF_MONTH,0);
c.set(Calendar.HOUR_OF_DAY,2);
c.set(Calendar.MINUTE,0);
c.set(Calendar.SECOND,0);
long end = c.getTimeInMillis();
while (true){
System.out.println("ok");
try {
TimeUnit.SECONDS.sleep(end - start);
System.out.println("执行数据库备份命令!");
start = System.currentTimeMillis();
var cc = Calendar.getInstance();
cc.set(Calendar.MONTH,cc.get(Calendar.MONTH) + 1);
cc.set(Calendar.DAY_OF_MONTH,0);
cc.set(Calendar.HOUR_OF_DAY,2);
cc.set(Calendar.MINUTE,0);
cc.set(Calendar.SECOND,0);
end = cc.getTimeInMillis();
} catch (Exception e){
e.printStackTrace();
}
}
}).start();
}
}
模拟售票
public class Test2 {
// 模拟售票
public static void main(String[] args) {
Test2 t = new Test2();
new Thread(t::out," 东风路").start();
new Thread(t::out," 南阳路").start();
new Thread(t::out," 瑞达路").start();
new Thread(t::out," 科学大道").start();
}
List<String> set = new ArrayList<>();
int num = 50;
public Test2() {
this.num = 50;
for (int i = 0; i < this.num; i++) {
set.add(String.format("%03d", i + 1));
}
}
public Test2(int num) {
this.num = num;
for (int i = 0; i < this.num; i++) {
set.add(String.format("%03d", i + 1));
}
}
public void out() {
Random rand = new Random();
String t = Thread.currentThread().getName();
while (this.set.size() > 0) {
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
synchronized (this) {
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
try {
int index = rand.nextInt(this.set.size());
String p = this.set.get(index);
this.set.remove(p);
if (this.set.size() == 0) {
System.out.printf("%s:售出%s票,票已经售完。%n%n", t, p);
} else {
System.out.printf("%s:售出%s票,还有%d张票%n", t, p, this.set.size());
}
} catch (Exception e) {
System.out.printf("%s:票已经售完。%n", t);
}
}
}
}
}
用15个线程实现,求123456789之间+-和100的表达式(11结果,)如果一个线程求出结果,立即告诉其他停止
public class Test3 {
volatile List<String> list = new ArrayList<>();
public static void main(String[] args) {
/* 用15个线程实现,求123456789之间+-和100的表达式(11结果,)
* 如果一个线程求出结果,立即告诉其他停止 */
var t = new Test3();
for (int i = 0; i < 15; i++) {
new Thread(t::op,"T" + i).start();
}
}
void op() {
System.out.printf("%s 启动计算机中 %n", Thread.currentThread().getName());
String[] o = new String[]{"", "+", "-"};
Random rand = new Random();
StringBuffer str = new StringBuffer("1");
Pattern p = Pattern.compile("(\\d+|-\\d+)");
stop:
while (list.size() != 11) {
for (int i = 2; i < 10; i++) {
str.append(String.format("%s%d", o[rand.nextInt(o.length)], i));
String s = str.toString();
Matcher m = p.matcher(s);
List<Integer> ln = new ArrayList<>();
while (m.find()) {
ln.add(Integer.parseInt(m.group()));
}
int sum = ln.stream().reduce(0, Integer::sum);
if (sum == 100 && !list.contains(s)) {
list.add(s);
System.out.printf("[%s]:%s = 100%n", Thread.currentThread().getName(), s);
break;
} else {
str.delete(1,str.length());
break;
}
}
System.out.printf("%s 结束 %n",Thread.currentThread().getName());
}
}
}
编写程序:实现三个线程,运行输出A1 B2 C3 A4 B5 C6...
public class Test4 {
AtomicInteger num = new AtomicInteger(0);
ReentrantLock lock = new ReentrantLock(true);
public static void main(String[] args) {
/* 编写程序:实现三个线程,运行输出A1 B2 C3 A4 B5 C6... */
var t = new Test4();
var a = new Thread(t::work,"A");
a.start();
var b = new Thread(t::work,"B");
b.start();
var c = new Thread(t::work,"C");
c.start();
}
void work(){
String tn = Thread.currentThread().getName();
while (true){
lock.lock();
try {
TimeUnit.SECONDS.sleep(1);
} catch (Exception e){
e.printStackTrace();
}
System.out.printf("%s%d ",tn,num.incrementAndGet());
if ("C".equalsIgnoreCase(tn)){
System.out.println();
}
lock.unlock();
}
}
}