Java Memory Model
package st;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;/*** @author ZhangSan_Plus* @version 1.0* @className Employee* @description TODO* @date 2021/3/15 14:18**/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Employee {private String name;private Integer age;private Department department;public void sayJoke(String context) {System.out.Name() + "说:" + context);}public static void main(String[] args) {Employee employee = new Employee();employee.setName("张三");employee.setAge(19);Department department = new Department();department.setDName("技术研发部");employee.setDepartment(department);employee.sayJoke("一言不合就开车");}
}@Data
@AllArgsConstructor
@NoArgsConstructor
class Department {private String dName;
}
package ployee.match;import lombok.SneakyThrows;import java.util.Random;/*** @author ZhangSan_Plus* @version 1.0* @className Match1* @description TODO* @date 2021/3/15 14:55**/
public class Match1 {public static void main(String[] args) {Runner runner = new Runner();runner.setName("张三");Runner runner1 = new Runner();runner1.setName("刘翔");Runner runner2 = new Runner();runner2.setName("路飞");runner.start();runner1.start();runner2.start();}
}class Runner extends Thread {@SneakyThrows(value = {InterruptedException.class})@Overridepublic void run() {Integer speed = new Random().nextInt(100);for (int i = 0; i < 100; i++) {Thread.sleep(1000);System.out.Name() + ": 已前进" + (i * speed) + "米" + "===(" + speed + "米/秒)");}}
}
上述代码中会创建几个线程呢?
答:5个线程(main,张三,刘翔,路飞,垃圾回收)
package ployee.match;import lombok.SneakyThrows;import java.util.Random;/*** @author ZhangSan_Plus* @version 1.0* @className Match2* @description TODO* @date 2021/3/15 16:02**/
public class Match2 {public static void main(String[] args) {Runner2 runner = new Runner2();Thread thread = new Thread(runner);thread.setName("张三");Runner2 runner1 = new Runner2();Thread thread1 = new Thread(runner1);thread1.setName("刘翔");Runner2 runner2 = new Runner2();Thread thread2 = new Thread(runner2);thread2.setName("路飞");thread.start();thread1.start();thread2.start();}}class Runner2 implements Runnable {@SneakyThrows(value = {InterruptedException.class})@Overridepublic void run() {Integer speed = new Random().nextInt(100);for (int i = 0; i < 100; i++) {Thread.sleep(1000);System.out.println(Thread.currentThread().getName() + ": 已前进" + (i * speed) + "米" + "===(" + speed + "米/秒)");}}
}
并发工具包
package ployee.match;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.SneakyThrows;
import org.urrent.BasicThreadFactory;import java.util.Random;
import urrent.*;/*** @author ZhangSan_Plus* @version 1.0* @className Match3* @description TODO* @date 2021/3/15 16:40**/
public class Match3 {@SneakyThrows(value = {Exception.class})public static void main(String[] args) {//创建线程池ScheduledExecutorService executorService = new ScheduledThreadPoolExecutor(3,new BasicThreadFactory.Builder().namingPattern("example-schedule-pool-%d").daemon(true).build());Runner3 runner3 = new Runner3("张三");Runner3 runner3x = new Runner3("李四");Runner3 runner3xx = new Runner3("王五");//线程池自动分配线程 Future对象用于接收线程内部call方法的返回值Future<Integer> result1 = executorService.submit(runner3);Future<Integer> result2 = executorService.submit(runner3x);Future<Integer> result3 = executorService.submit(runner3xx);Thread.sleep(3000);System.out.println("张三累计跑了" + () + "米");System.out.println("张三累计跑了" + () + "米");System.out.println("张三累计跑了" + () + "米");executorService.shutdown();}}@Data
@NoArgsConstructor
@AllArgsConstructor
class Runner3 implements Callable<Integer> {private String name;public static void main(String[] args) {}@Overridepublic Integer call() throws Exception {Integer speed = new Random().nextInt(100);Integer distinct = 0;for (int i = 0; i < 10; i++) {Thread.sleep(10);distinct = i * speed;System.out.Name() + " 已前进 " + distinct + "米(" + speed + "/秒)");}return distinct;}
}
注:这里不推荐使用ExecutorService executorService1 = wFixedThreadPool(3);
这种方式来创建线程
可能会出现
package st;urrent.ThreadFactoryBuilder;import java.util.Random;
import urrent.ThreadFactory;/*** @author ZhangSan_Plus* @version 1.0* @className SyncSample* @description TODO* @date 2021/3/16 13:44**/
public class SyncSample {public static void main(String[] args) {Couplet c = new Couplet();ThreadFactory namedThreadFactory = new ThreadFactoryBuilder().setNameFormat("demo-pool-%d").build();for (int i = 0; i < 10000; i++) {wThread(() -> {int r = new Random().nextInt(2);if (r % 2 == 0) {Couplet.first();} else {Couplet.second();}}).start();}}
}class Couplet {public synchronized static void first() {System.out.printf("举");System.out.printf("头");System.out.printf("望");System.out.printf("明");System.out.printf("月");System.out.println();}public static void second() {synchronized (Couplet.class) {System.out.printf("低");System.out.printf("头");System.out.printf("思");System.out.printf("故");System.out.printf("乡");System.out.println();}}
}
本文发布于:2024-01-28 08:34:56,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/17064020996144.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |