diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index 454757c..0000000 Binary files a/.DS_Store and /dev/null differ diff --git a/.idea/artifacts/concurrency_war.xml b/.idea/artifacts/concurrency_war.xml new file mode 100644 index 0000000..c242efa --- /dev/null +++ b/.idea/artifacts/concurrency_war.xml @@ -0,0 +1,14 @@ + + + $PROJECT_DIR$/target + + + concurrency + war + + + + + + + \ No newline at end of file diff --git a/.idea/artifacts/concurrency_war_exploded.xml b/.idea/artifacts/concurrency_war_exploded.xml new file mode 100644 index 0000000..fc52b15 --- /dev/null +++ b/.idea/artifacts/concurrency_war_exploded.xml @@ -0,0 +1,76 @@ + + + $PROJECT_DIR$/target/concurrency-0.0.1-SNAPSHOT + + + true + concurrency + war + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/dictionaries/shishusheng.xml b/.idea/dictionaries/shishusheng.xml new file mode 100644 index 0000000..881bbf2 --- /dev/null +++ b/.idea/dictionaries/shishusheng.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..b26911b --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..85193ab --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,37 @@ + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__ch_qos_logback_logback_classic_1_1_11.xml b/.idea/libraries/Maven__ch_qos_logback_logback_classic_1_1_11.xml new file mode 100644 index 0000000..c6ea67e --- /dev/null +++ b/.idea/libraries/Maven__ch_qos_logback_logback_classic_1_1_11.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__ch_qos_logback_logback_core_1_1_11.xml b/.idea/libraries/Maven__ch_qos_logback_logback_core_1_1_11.xml new file mode 100644 index 0000000..f538e36 --- /dev/null +++ b/.idea/libraries/Maven__ch_qos_logback_logback_core_1_1_11.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_fasterxml_classmate_1_3_4.xml b/.idea/libraries/Maven__com_fasterxml_classmate_1_3_4.xml new file mode 100644 index 0000000..33c30b4 --- /dev/null +++ b/.idea/libraries/Maven__com_fasterxml_classmate_1_3_4.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_annotations_2_8_0.xml b/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_annotations_2_8_0.xml new file mode 100644 index 0000000..49b4ec7 --- /dev/null +++ b/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_annotations_2_8_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_core_2_8_10.xml b/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_core_2_8_10.xml new file mode 100644 index 0000000..5d9d662 --- /dev/null +++ b/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_core_2_8_10.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_databind_2_8_10.xml b/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_databind_2_8_10.xml new file mode 100644 index 0000000..df5cb22 --- /dev/null +++ b/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_databind_2_8_10.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_google_code_findbugs_jsr305_1_3_9.xml b/.idea/libraries/Maven__com_google_code_findbugs_jsr305_1_3_9.xml new file mode 100644 index 0000000..0e66824 --- /dev/null +++ b/.idea/libraries/Maven__com_google_code_findbugs_jsr305_1_3_9.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_google_errorprone_error_prone_annotations_2_0_18.xml b/.idea/libraries/Maven__com_google_errorprone_error_prone_annotations_2_0_18.xml new file mode 100644 index 0000000..702d49b --- /dev/null +++ b/.idea/libraries/Maven__com_google_errorprone_error_prone_annotations_2_0_18.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_google_guava_guava_23_0.xml b/.idea/libraries/Maven__com_google_guava_guava_23_0.xml new file mode 100644 index 0000000..589a439 --- /dev/null +++ b/.idea/libraries/Maven__com_google_guava_guava_23_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_google_j2objc_j2objc_annotations_1_1.xml b/.idea/libraries/Maven__com_google_j2objc_j2objc_annotations_1_1.xml new file mode 100644 index 0000000..c06f999 --- /dev/null +++ b/.idea/libraries/Maven__com_google_j2objc_j2objc_annotations_1_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_jayway_jsonpath_json_path_2_2_0.xml b/.idea/libraries/Maven__com_jayway_jsonpath_json_path_2_2_0.xml new file mode 100644 index 0000000..578b079 --- /dev/null +++ b/.idea/libraries/Maven__com_jayway_jsonpath_json_path_2_2_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_vaadin_external_google_android_json_0_0_20131108_vaadin1.xml b/.idea/libraries/Maven__com_vaadin_external_google_android_json_0_0_20131108_vaadin1.xml new file mode 100644 index 0000000..b8581a6 --- /dev/null +++ b/.idea/libraries/Maven__com_vaadin_external_google_android_json_0_0_20131108_vaadin1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__javax_validation_validation_api_1_1_0_Final.xml b/.idea/libraries/Maven__javax_validation_validation_api_1_1_0_Final.xml new file mode 100644 index 0000000..940ce73 --- /dev/null +++ b/.idea/libraries/Maven__javax_validation_validation_api_1_1_0_Final.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__joda_time_joda_time_2_9.xml b/.idea/libraries/Maven__joda_time_joda_time_2_9.xml new file mode 100644 index 0000000..bb6a71f --- /dev/null +++ b/.idea/libraries/Maven__joda_time_joda_time_2_9.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__junit_junit_4_12.xml b/.idea/libraries/Maven__junit_junit_4_12.xml new file mode 100644 index 0000000..d411041 --- /dev/null +++ b/.idea/libraries/Maven__junit_junit_4_12.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__net_minidev_accessors_smart_1_1.xml b/.idea/libraries/Maven__net_minidev_accessors_smart_1_1.xml new file mode 100644 index 0000000..88d626e --- /dev/null +++ b/.idea/libraries/Maven__net_minidev_accessors_smart_1_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__net_minidev_json_smart_2_2_1.xml b/.idea/libraries/Maven__net_minidev_json_smart_2_2_1.xml new file mode 100644 index 0000000..6c692c8 --- /dev/null +++ b/.idea/libraries/Maven__net_minidev_json_smart_2_2_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_apache_commons_commons_pool2_2_4_3.xml b/.idea/libraries/Maven__org_apache_commons_commons_pool2_2_4_3.xml new file mode 100644 index 0000000..cc0b58b --- /dev/null +++ b/.idea/libraries/Maven__org_apache_commons_commons_pool2_2_4_3.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_apache_tomcat_embed_tomcat_embed_core_8_5_23.xml b/.idea/libraries/Maven__org_apache_tomcat_embed_tomcat_embed_core_8_5_23.xml new file mode 100644 index 0000000..99e8c9e --- /dev/null +++ b/.idea/libraries/Maven__org_apache_tomcat_embed_tomcat_embed_core_8_5_23.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_apache_tomcat_embed_tomcat_embed_el_8_5_23.xml b/.idea/libraries/Maven__org_apache_tomcat_embed_tomcat_embed_el_8_5_23.xml new file mode 100644 index 0000000..9837b75 --- /dev/null +++ b/.idea/libraries/Maven__org_apache_tomcat_embed_tomcat_embed_el_8_5_23.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_apache_tomcat_embed_tomcat_embed_websocket_8_5_23.xml b/.idea/libraries/Maven__org_apache_tomcat_embed_tomcat_embed_websocket_8_5_23.xml new file mode 100644 index 0000000..6a989bb --- /dev/null +++ b/.idea/libraries/Maven__org_apache_tomcat_embed_tomcat_embed_websocket_8_5_23.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_apache_tomcat_tomcat_annotations_api_8_5_23.xml b/.idea/libraries/Maven__org_apache_tomcat_tomcat_annotations_api_8_5_23.xml new file mode 100644 index 0000000..4aba27a --- /dev/null +++ b/.idea/libraries/Maven__org_apache_tomcat_tomcat_annotations_api_8_5_23.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_assertj_assertj_core_2_6_0.xml b/.idea/libraries/Maven__org_assertj_assertj_core_2_6_0.xml new file mode 100644 index 0000000..58bdc9a --- /dev/null +++ b/.idea/libraries/Maven__org_assertj_assertj_core_2_6_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_codehaus_mojo_animal_sniffer_annotations_1_14.xml b/.idea/libraries/Maven__org_codehaus_mojo_animal_sniffer_annotations_1_14.xml new file mode 100644 index 0000000..1af11e4 --- /dev/null +++ b/.idea/libraries/Maven__org_codehaus_mojo_animal_sniffer_annotations_1_14.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_hamcrest_hamcrest_core_1_3.xml b/.idea/libraries/Maven__org_hamcrest_hamcrest_core_1_3.xml new file mode 100644 index 0000000..f58bbc1 --- /dev/null +++ b/.idea/libraries/Maven__org_hamcrest_hamcrest_core_1_3.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_hamcrest_hamcrest_library_1_3.xml b/.idea/libraries/Maven__org_hamcrest_hamcrest_library_1_3.xml new file mode 100644 index 0000000..78dbe45 --- /dev/null +++ b/.idea/libraries/Maven__org_hamcrest_hamcrest_library_1_3.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_hibernate_hibernate_validator_5_3_6_Final.xml b/.idea/libraries/Maven__org_hibernate_hibernate_validator_5_3_6_Final.xml new file mode 100644 index 0000000..3c0ddd4 --- /dev/null +++ b/.idea/libraries/Maven__org_hibernate_hibernate_validator_5_3_6_Final.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_jboss_logging_jboss_logging_3_3_1_Final.xml b/.idea/libraries/Maven__org_jboss_logging_jboss_logging_3_3_1_Final.xml new file mode 100644 index 0000000..6dc7a37 --- /dev/null +++ b/.idea/libraries/Maven__org_jboss_logging_jboss_logging_3_3_1_Final.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_mockito_mockito_core_1_10_19.xml b/.idea/libraries/Maven__org_mockito_mockito_core_1_10_19.xml new file mode 100644 index 0000000..a523703 --- /dev/null +++ b/.idea/libraries/Maven__org_mockito_mockito_core_1_10_19.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_objenesis_objenesis_2_1.xml b/.idea/libraries/Maven__org_objenesis_objenesis_2_1.xml new file mode 100644 index 0000000..7ab319b --- /dev/null +++ b/.idea/libraries/Maven__org_objenesis_objenesis_2_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_ow2_asm_asm_5_0_3.xml b/.idea/libraries/Maven__org_ow2_asm_asm_5_0_3.xml new file mode 100644 index 0000000..da69f6c --- /dev/null +++ b/.idea/libraries/Maven__org_ow2_asm_asm_5_0_3.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_skyscreamer_jsonassert_1_4_0.xml b/.idea/libraries/Maven__org_skyscreamer_jsonassert_1_4_0.xml new file mode 100644 index 0000000..f86d2c8 --- /dev/null +++ b/.idea/libraries/Maven__org_skyscreamer_jsonassert_1_4_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_slf4j_jcl_over_slf4j_1_7_25.xml b/.idea/libraries/Maven__org_slf4j_jcl_over_slf4j_1_7_25.xml new file mode 100644 index 0000000..bae9949 --- /dev/null +++ b/.idea/libraries/Maven__org_slf4j_jcl_over_slf4j_1_7_25.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_slf4j_jul_to_slf4j_1_7_25.xml b/.idea/libraries/Maven__org_slf4j_jul_to_slf4j_1_7_25.xml new file mode 100644 index 0000000..6073e53 --- /dev/null +++ b/.idea/libraries/Maven__org_slf4j_jul_to_slf4j_1_7_25.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_slf4j_log4j_over_slf4j_1_7_25.xml b/.idea/libraries/Maven__org_slf4j_log4j_over_slf4j_1_7_25.xml new file mode 100644 index 0000000..a14ac63 --- /dev/null +++ b/.idea/libraries/Maven__org_slf4j_log4j_over_slf4j_1_7_25.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_slf4j_slf4j_api_1_7_25.xml b/.idea/libraries/Maven__org_slf4j_slf4j_api_1_7_25.xml new file mode 100644 index 0000000..20e8163 --- /dev/null +++ b/.idea/libraries/Maven__org_slf4j_slf4j_api_1_7_25.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_boot_spring_boot_1_5_9_RELEASE.xml b/.idea/libraries/Maven__org_springframework_boot_spring_boot_1_5_9_RELEASE.xml new file mode 100644 index 0000000..44dc419 --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_boot_spring_boot_1_5_9_RELEASE.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_boot_spring_boot_autoconfigure_1_5_9_RELEASE.xml b/.idea/libraries/Maven__org_springframework_boot_spring_boot_autoconfigure_1_5_9_RELEASE.xml new file mode 100644 index 0000000..4c3a2b7 --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_boot_spring_boot_autoconfigure_1_5_9_RELEASE.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_1_5_9_RELEASE.xml b/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_1_5_9_RELEASE.xml new file mode 100644 index 0000000..c6ba5e1 --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_1_5_9_RELEASE.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_logging_1_5_9_RELEASE.xml b/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_logging_1_5_9_RELEASE.xml new file mode 100644 index 0000000..33c0b1c --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_logging_1_5_9_RELEASE.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_test_1_5_9_RELEASE.xml b/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_test_1_5_9_RELEASE.xml new file mode 100644 index 0000000..d7db397 --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_test_1_5_9_RELEASE.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_tomcat_1_5_9_RELEASE.xml b/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_tomcat_1_5_9_RELEASE.xml new file mode 100644 index 0000000..ed7b340 --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_tomcat_1_5_9_RELEASE.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_web_1_5_9_RELEASE.xml b/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_web_1_5_9_RELEASE.xml new file mode 100644 index 0000000..f0bd94f --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_web_1_5_9_RELEASE.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_boot_spring_boot_test_1_5_9_RELEASE.xml b/.idea/libraries/Maven__org_springframework_boot_spring_boot_test_1_5_9_RELEASE.xml new file mode 100644 index 0000000..9312efe --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_boot_spring_boot_test_1_5_9_RELEASE.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_boot_spring_boot_test_autoconfigure_1_5_9_RELEASE.xml b/.idea/libraries/Maven__org_springframework_boot_spring_boot_test_autoconfigure_1_5_9_RELEASE.xml new file mode 100644 index 0000000..07d7bca --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_boot_spring_boot_test_autoconfigure_1_5_9_RELEASE.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_spring_aop_4_3_13_RELEASE.xml b/.idea/libraries/Maven__org_springframework_spring_aop_4_3_13_RELEASE.xml new file mode 100644 index 0000000..e06e71e --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_spring_aop_4_3_13_RELEASE.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_spring_beans_4_3_13_RELEASE.xml b/.idea/libraries/Maven__org_springframework_spring_beans_4_3_13_RELEASE.xml new file mode 100644 index 0000000..0a8cafe --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_spring_beans_4_3_13_RELEASE.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_spring_context_4_3_13_RELEASE.xml b/.idea/libraries/Maven__org_springframework_spring_context_4_3_13_RELEASE.xml new file mode 100644 index 0000000..8050852 --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_spring_context_4_3_13_RELEASE.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_spring_core_4_3_13_RELEASE.xml b/.idea/libraries/Maven__org_springframework_spring_core_4_3_13_RELEASE.xml new file mode 100644 index 0000000..b95dd78 --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_spring_core_4_3_13_RELEASE.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_spring_expression_4_3_13_RELEASE.xml b/.idea/libraries/Maven__org_springframework_spring_expression_4_3_13_RELEASE.xml new file mode 100644 index 0000000..7a825ff --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_spring_expression_4_3_13_RELEASE.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_spring_test_4_3_13_RELEASE.xml b/.idea/libraries/Maven__org_springframework_spring_test_4_3_13_RELEASE.xml new file mode 100644 index 0000000..0c0fcbf --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_spring_test_4_3_13_RELEASE.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_spring_web_4_3_13_RELEASE.xml b/.idea/libraries/Maven__org_springframework_spring_web_4_3_13_RELEASE.xml new file mode 100644 index 0000000..31aebfb --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_spring_web_4_3_13_RELEASE.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_spring_webmvc_4_3_13_RELEASE.xml b/.idea/libraries/Maven__org_springframework_spring_webmvc_4_3_13_RELEASE.xml new file mode 100644 index 0000000..01a3291 --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_spring_webmvc_4_3_13_RELEASE.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_yaml_snakeyaml_1_17.xml b/.idea/libraries/Maven__org_yaml_snakeyaml_1_17.xml new file mode 100644 index 0000000..20e2920 --- /dev/null +++ b/.idea/libraries/Maven__org_yaml_snakeyaml_1_17.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__redis_clients_jedis_2_8_2.xml b/.idea/libraries/Maven__redis_clients_jedis_2_8_2.xml new file mode 100644 index 0000000..5fe8223 --- /dev/null +++ b/.idea/libraries/Maven__redis_clients_jedis_2_8_2.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..7d01223 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..6373207 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000..8bb0e83 --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/README.md b/README.md index 79d2603..e225f10 100755 --- a/README.md +++ b/README.md @@ -1,78 +1,203 @@ -## 1 目标 -致力于构建全球最完善的 Java 高并发理论体系。让我们的程序更加可靠,跳槽面试更轻松。 +# 0 Java 高并发理论 基础知识点全覆盖 +## 无论跳槽面试 / 开发,技能都将高人一等 -## 高并发方案概要 -### 线程安全性 -线程安全性,主要从原子性、可见性、有序性 +# 1 多线程并发与线程安全,让程序更可靠 -### 安全发布对象 -安全发布对象的一些核心方法,主要通过单例类的多种实现方式体会,这也是对线程安全性的巩固,也是把线程安全性涉及的一些关键字和类再一次放到实际场景使用。 +## 大量代码实例来讲解,深度掌握高并发编程 -### 线程安全策略 +![](https://uploadfiles.nowcoder.com/files/20190815/5088755_1565799768157_4685968-6fc1465c0b063ef8.png) + +# 2 高并发处理思路与手段,让跳槽面试从容不迫 + +## 2.1 接轨企业需求的并发技能 + +从真实应用场景出发,从0解构线程与并发 + +## 2.2 并发面试综合案例 + +并发面试必问考点,理清思路总结要点 + +## 2.3 设计巧妙易于理解 + +巧妙实例便于理解 + +![](https://uploadfiles.nowcoder.com/files/20190815/5088755_1565799768174_4685968-7fd306f9bc9b4bec.png) + +## 2.4 深入理解底层原理 解决企业级并发业务问题 翻越并发技术的大山 + +### 线程的核心 + +#### 工作/面试的利器 + +- 线程N种实现方式 +网络众口不一,真伪难辨,本教程直击本质 + +- 线程启动你真的会么? +启动线程,从错误到正确,带你从错误中总结真理 + +- 线程停止、中断的最佳实践 +把我线程停止原则 + +- 图解线程生命周期 +面试 show 出此图,优秀候选人非你莫属 + +- 趣解Thread和Object类中线程相关方法 +wait、notify、join、yield…各有千秋 + +- 一网打尽线程属性线程属性 +三大经典面试问题,你晓得么? + +- 线程异常处理 +无处不在的异常,只需一招自定义异常 + +- 线程安全与程序性能,取舍之道 +线程安全导致性能降低,看似无解,实则只是学艺不精 + +# 3 精讲Java面试中的高频并发问题 +为什么wait必须在同步代码块中使用? + +线程是如何在6种状态之间切换的? + +哪些场景需要额外注意线程安全问题? + +讲一讲什么是Java内存模型? + +happens-before、volatile和可见性的关系? + +实际开发中如何避免死锁? + +# 4 领悟Java大佬的学习方法与体系思想 +如何从宏观和微观两个方面来提高技术? + +提高技术的途径有哪些? + +如何了解技术领域的前沿动态? + +工作中业务缠身,如何在业务开发中得到更多成长? + +如何分析native的c/cpp代码,如何使用openJDK? + +“自顶向下”的学习方法以及好处? + +# 5 环境参数 + +## 基本工具 + +- Maven 3.3.9+ + +- JDK 8+ + +- Tomcat 8+ + +- MySQL 8.0.16+ + +- Redis 5+ + +## IDE +Intellij IDEA 2019.2+ + +## 测试工具 +Postman + +JMeter + +## 框架 +SpringBoot + +Mybatis + +## 组件 +Kafka + +RabbitMQ + +elastic-job... + +# 6 知识点概要 + +## 线程安全性 +线程安全性,主要从原子性、可见性、有序性三个方面 + +原子性部分, atomic包下相关类、CAS原理、Unsafe类、synchronized关键字等的使用及注意事项 +可见性部分,主要介绍的是volatile关键字的规则和使用,及synchronized关键字的可见性 +有序性部分,则重点讲解了happens-before原则 + +## 安全发布对象 +安全发布对象的一些核心方法,主要通过单例类的多种实现方式,让大家在实现过程中去体会这些方法的具体含义 +这也是对线程安全性的巩固,也是把线程安全性涉及的一些关键字和类再一次放到实际场景中使用,加深大家对他们的印象和认识 + +## 线程安全策略 线程安全策略,包括定义不可变对象、线程封闭、同步容器、并发容器等,引出并发里的关键知识J.U.C。 -同时还额外介绍了开发中常见的一些线程不安全类和写法,并给出他们各自对应的替代方案。 -### AQS -J.U.C的重要组件,面试必问考点。 +同时还额外介绍了开发中常见的一些线程不安全类和写法,并给出他们各自对应的替代方案。这一章涉及的内容在日常开发和面试中都会涉及很多。... -AQS模型设计及相关同步组件的原理和使用,都非常实用,包括:CountDownLatch、Semaphore、CyclicBarrier、ReentrantLock与锁、Condition等。 +## J.U.C之AQS讲解 +AQS是J.U.C的重要组件,也是面试的重要考点。 -这些组件需要大家能熟练明白他们的用途及差异,不但会使用,而且还要明确知道不同方法调用后的不同效果。 +AQS模型设计及相关同步组件的原理和使用,都非常实用,具体包括:CountDownLatch、Semaphore、CyclicBarrier、ReentrantLock与锁、Condition等。 -### J.U.C组件拓展 +这些组件需要大家能熟练明白他们的用途及差异,不但会使用,而且还要明确知道不同方法调用后的不同效果。... +## J.U.C组件拓展 J.U.C相关组件,主要包括FutureTask、Fork/Join框架、BlockingQueue,其中FutureTask讲解时会对比着Callable、Runnable、Future来讲。 这些组件使用场景相对AQS会少一些,但也是J.U.C的重要组成部分,也是需要掌握的 -### 线程调度-线程池 -new Thread弊端、线程池的好处、ThreadPoolExecutor详细介绍(参数、状态、方法)、线程池类图、Executor框架接口 +## 线程调度-线程池 +J.U.C里最后一部分:线程池。面试大概率会问到线程池相关的知识点。 + +这一章将主要从new Thread弊端、线程池的好处、ThreadPoolExecutor详细介绍(参数、状态、方法)、线程池类图、Executor框架接口等进行讲解,需要大家能了解线程池的许多细节及配置,并能在实际项目中正确使用 -### 多线程并发拓展 -死锁产生的条件及预防、多线程并发编程的最佳实践、Spring与线程安全、以及面试都特别喜欢问的HashMap和ConcurrentMap源码细节 -### 扩容 -垂直扩容和水平扩容的区别,数据库读操作扩展和写操作扩展 +## 多线程并发拓展讲解 +对并发编程做些补充,但都贴近当前的面试,主要讲解死锁产生的条件及预防、多线程并发编程的最佳实践、Spring与线程安全、以及面试都特别喜欢问的HashMap和ConcurrentMap源码细节。当然,面试喜欢问的问题,对实际项目开发也是特别重要的 -### 缓存 -缓存特征(命中率、最大元素、清空策略)、影响缓存命中率因素、缓存分类和应用场景(本地缓存、分布式缓存)、高并发场景下缓存常见问题(缓存一致性、缓存并发、缓存穿透、雪崩) -### MQ -消息队列的特性(业务无关、FIFO、容灾、性能)、为什么需要消息队列以及消息队列的好处(业务解耦、最终一致性、广播、错峰与流控) +## 高并发之扩容 +高并发部分:思路,侧重面试,扩容思路,首先介绍垂直扩容和水平扩容的区别,之后介绍数据库读操作扩展和写操作扩展思路。 -### 应用拆分 +## 高并发之缓存 +思路,本章讲解高并发中缓存方案。 -### 限流 -明确限流的重要作用 -限流常用的四种算法:计数法、滑动窗口、漏桶算法和令牌桶算法 +包含对缓存特征(命中率、最大元素、清空策略)、影响缓存命中率因素、缓存分类和应用场景(本地缓存、分布式缓存)、高并发场景下缓存常见问题(缓存一致性、缓存并发、缓存穿透、雪崩)等的具体介绍。此外,针对大家常用的缓存组件Guava Cache、Memcache、Redis -### 服务降级与服务熔断 -服务降级的分类:自动降级(超时、失败次数、故障、限流)和人工降级(开关),总结了服务降级和服务熔断的共性(目的、最终表现、粒度、自治)和区别(出发原因、管理目标层次、实现方式)以及服务降级要考虑的问题 +## 高并发之消息队列 +思路,本章介绍了消息队列的特性(业务无关、FIFO、容灾、性能)、为什么需要消息队列以及消息队列的好处(业务解耦、最终一致性、广播、错峰与流控),最后对当前比较流行的消息队列组件kafka和rabbitmq做了架构分析和特性介绍 -### 分库分表 +## 高并发之应用拆分 +从实际项目拆分步骤讲起,让大家可以实际感受到应用拆分的好处和解决的问题,之后引出对应用拆分原则(业务优先、循序渐进、兼顾技术、可靠测试)和应用拆分时思考的内容(应用之间通信、应用之间数据库设计、避免事务跨应用),并引出对服务化Dubbo和微服务Spring Cloud的框架介绍 -## QQ 技术交流群 +## 高并发之应用限流 +思路,本章从实际项目保存百万数据的限流场景开始讲起,让大家感受一下某些高并发场景下使用限流和不使用限流的区别,明确限流的重要作用 -为大家提供一个学习交流平台,在这里你可以自由地讨论技术问题。 +之后详细介绍了限流常用的四种算法:计数法、滑动窗口、漏桶算法和令牌桶算法,并对他们做了简单的对比 - +## 服务降级与服务熔断 +通过举例让大家明白什么是服务降级和服务熔断 -## 微信交流群 - +之后介绍了服务降级的分类:自动降级(超时、失败次数、故障、限流)和人工降级(开关),总结了服务降级和服务熔断的共性(目的、最终表现、粒度、自治)和区别(出发原因、管理目标层次、实现方式)以及服务降级要考虑的问题 -### 本人微信 - +最后介绍了Hystrix -## Java源码模拟面试解析指南 +## 数据库分库分表与高可用手段 +高并发部分:主讲思路,从数据库瓶颈开始讲起,引出对数据库切库分库分表的介绍。数据库切库里重点介绍了读写分离的设计,对比支持多数据源和分库的区别; - - +最后介绍了什么时候该考虑分表、横向分表与纵向分表,以及通过mybatis的分页插件shardbatis2.0实现数据库分表 +之后介绍了高可用的三个常用手段:任务调度系统分布 + +## 知识体系总结 +对知识进行总结回顾,希望大家都能有所收获,并期待与大家共同探讨并发与高并发的话题 -### 绘图工具 -- [draw.io](https://www.draw.io/) -- keynote -## 知识体系 ![](https://uploadfiles.nowcoder.com/files/20190815/5088755_1565799768221_4685968-76a236d781f7dee7.png) + +# 参考 +- [Java并发编程实战](https://book.douban.com/subject/10484692/) + +- [Java并发编程入门与高并发面试](https://coding.imooc.com/class/195.html) + +- [Java并发编程的艺术](https://book.douban.com/subject/26591326/) + +- [深入理解Java虚拟机第二版](https://book.douban.com/subject/24722612/) diff --git a/assets/LOGO.png b/assets/LOGO.png deleted file mode 100644 index b5e3b09..0000000 Binary files a/assets/LOGO.png and /dev/null differ diff --git "a/assets/QQ \347\276\244.JPG" "b/assets/QQ \347\276\244.JPG" deleted file mode 100644 index c6a3f39..0000000 Binary files "a/assets/QQ \347\276\244.JPG" and /dev/null differ diff --git "a/assets/\344\270\252\344\272\272\345\276\256\344\277\241.jpeg" "b/assets/\344\270\252\344\272\272\345\276\256\344\277\241.jpeg" deleted file mode 100644 index 35b73f0..0000000 Binary files "a/assets/\344\270\252\344\272\272\345\276\256\344\277\241.jpeg" and /dev/null differ diff --git "a/assets/\345\205\254\344\274\227\345\217\267.png" "b/assets/\345\205\254\344\274\227\345\217\267.png" deleted file mode 100644 index e8c9c92..0000000 Binary files "a/assets/\345\205\254\344\274\227\345\217\267.png" and /dev/null differ diff --git "a/assets/\345\276\256\344\277\241\347\276\244.jpeg" "b/assets/\345\276\256\344\277\241\347\276\244.jpeg" deleted file mode 100644 index abeb9ae..0000000 Binary files "a/assets/\345\276\256\344\277\241\347\276\244.jpeg" and /dev/null differ diff --git "a/assets/\347\211\233\345\256\242\344\270\223\345\210\212.png" "b/assets/\347\211\233\345\256\242\344\270\223\345\210\212.png" deleted file mode 100644 index 6f48493..0000000 Binary files "a/assets/\347\211\233\345\256\242\344\270\223\345\210\212.png" and /dev/null differ diff --git a/concurrency.iml b/concurrency.iml new file mode 100644 index 0000000..a91de9f --- /dev/null +++ b/concurrency.iml @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/com/javaedge/concurrency/ConcurrencyApplication.java b/concurrency/src/main/java/com/javaedge/concurrency/ConcurrencyApplication.java similarity index 95% rename from src/main/java/com/javaedge/concurrency/ConcurrencyApplication.java rename to concurrency/src/main/java/com/javaedge/concurrency/ConcurrencyApplication.java index aec342b..edd52be 100755 --- a/src/main/java/com/javaedge/concurrency/ConcurrencyApplication.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/ConcurrencyApplication.java @@ -1,4 +1,4 @@ -package main.java.com.javaedge.concurrency; +package com.javaedge.concurrency; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; diff --git a/src/main/java/com/javaedge/concurrency/ConcurrencyTest.java b/concurrency/src/main/java/com/javaedge/concurrency/ConcurrencyTest.java similarity index 96% rename from src/main/java/com/javaedge/concurrency/ConcurrencyTest.java rename to concurrency/src/main/java/com/javaedge/concurrency/ConcurrencyTest.java index 12867a7..2967863 100755 --- a/src/main/java/com/javaedge/concurrency/ConcurrencyTest.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/ConcurrencyTest.java @@ -1,4 +1,4 @@ -package main.java.com.javaedge.concurrency; +package com.javaedge.concurrency; import com.javaedge.concurrency.annoations.NotThreadSafe; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/com/javaedge/concurrency/HttpFilter.java b/concurrency/src/main/java/com/javaedge/concurrency/HttpFilter.java similarity index 90% rename from src/main/java/com/javaedge/concurrency/HttpFilter.java rename to concurrency/src/main/java/com/javaedge/concurrency/HttpFilter.java index 87dcb65..aec3df4 100755 --- a/src/main/java/com/javaedge/concurrency/HttpFilter.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/HttpFilter.java @@ -1,6 +1,6 @@ -package main.java.com.javaedge.concurrency; +package com.javaedge.concurrency; -import com.javaedge.concurrency.threadLocal.RequestHolder; +import com.javaedge.concurrency.example.threadLocal.RequestHolder; import lombok.extern.slf4j.Slf4j; import javax.servlet.Filter; diff --git a/src/main/java/com/javaedge/concurrency/HttpInterceptor.java b/concurrency/src/main/java/com/javaedge/concurrency/HttpInterceptor.java similarity index 87% rename from src/main/java/com/javaedge/concurrency/HttpInterceptor.java rename to concurrency/src/main/java/com/javaedge/concurrency/HttpInterceptor.java index 5172654..4ed6d77 100755 --- a/src/main/java/com/javaedge/concurrency/HttpInterceptor.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/HttpInterceptor.java @@ -1,6 +1,6 @@ -package main.java.com.javaedge.concurrency; +package com.javaedge.concurrency; -import com.javaedge.concurrency.threadLocal.RequestHolder; +import com.javaedge.concurrency.example.threadLocal.RequestHolder; import lombok.extern.slf4j.Slf4j; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; diff --git a/concurrency/src/main/java/com/javaedge/concurrency/ServletInitializer.java b/concurrency/src/main/java/com/javaedge/concurrency/ServletInitializer.java new file mode 100755 index 0000000..67b0810 --- /dev/null +++ b/concurrency/src/main/java/com/javaedge/concurrency/ServletInitializer.java @@ -0,0 +1,13 @@ +package com.javaedge.concurrency; + +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.boot.web.support.SpringBootServletInitializer; + +public class ServletInitializer extends SpringBootServletInitializer { + + @Override + protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { + return application.sources(ConcurrencyApplication.class); + } + +} diff --git a/src/main/java/com/javaedge/concurrency/TestController.java b/concurrency/src/main/java/com/javaedge/concurrency/TestController.java similarity index 89% rename from src/main/java/com/javaedge/concurrency/TestController.java rename to concurrency/src/main/java/com/javaedge/concurrency/TestController.java index 1429afc..bc49c01 100755 --- a/src/main/java/com/javaedge/concurrency/TestController.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/TestController.java @@ -1,4 +1,4 @@ -package main.java.com.javaedge.concurrency; +package com.javaedge.concurrency; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Controller; diff --git a/src/main/java/com/javaedge/concurrency/annoations/NotRecommend.java b/concurrency/src/main/java/com/javaedge/concurrency/annoations/NotRecommend.java similarity index 86% rename from src/main/java/com/javaedge/concurrency/annoations/NotRecommend.java rename to concurrency/src/main/java/com/javaedge/concurrency/annoations/NotRecommend.java index 51563d1..b1f1268 100755 --- a/src/main/java/com/javaedge/concurrency/annoations/NotRecommend.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/annoations/NotRecommend.java @@ -1,4 +1,4 @@ -package main.java.com.javaedge.concurrency.annoations; +package com.javaedge.concurrency.annoations; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/src/main/java/com/javaedge/concurrency/annoations/NotThreadSafe.java b/concurrency/src/main/java/com/javaedge/concurrency/annoations/NotThreadSafe.java similarity index 86% rename from src/main/java/com/javaedge/concurrency/annoations/NotThreadSafe.java rename to concurrency/src/main/java/com/javaedge/concurrency/annoations/NotThreadSafe.java index 479d656..3413bd8 100755 --- a/src/main/java/com/javaedge/concurrency/annoations/NotThreadSafe.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/annoations/NotThreadSafe.java @@ -1,4 +1,4 @@ -package main.java.com.javaedge.concurrency.annoations; +package com.javaedge.concurrency.annoations; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/src/main/java/com/javaedge/concurrency/annoations/Recommend.java b/concurrency/src/main/java/com/javaedge/concurrency/annoations/Recommend.java similarity index 86% rename from src/main/java/com/javaedge/concurrency/annoations/Recommend.java rename to concurrency/src/main/java/com/javaedge/concurrency/annoations/Recommend.java index ca616cc..6e8c350 100755 --- a/src/main/java/com/javaedge/concurrency/annoations/Recommend.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/annoations/Recommend.java @@ -1,4 +1,4 @@ -package main.java.com.javaedge.concurrency.annoations; +package com.javaedge.concurrency.annoations; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/src/main/java/com/javaedge/concurrency/annoations/ThreadSafe.java b/concurrency/src/main/java/com/javaedge/concurrency/annoations/ThreadSafe.java similarity index 86% rename from src/main/java/com/javaedge/concurrency/annoations/ThreadSafe.java rename to concurrency/src/main/java/com/javaedge/concurrency/annoations/ThreadSafe.java index e248e53..c38ef6f 100755 --- a/src/main/java/com/javaedge/concurrency/annoations/ThreadSafe.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/annoations/ThreadSafe.java @@ -1,4 +1,4 @@ -package main.java.com.javaedge.concurrency.annoations; +package com.javaedge.concurrency.annoations; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/src/main/java/com/javaedge/concurrency/cas/demo/ConcurrentStack.java b/concurrency/src/main/java/com/javaedge/concurrency/cas/demo/ConcurrentStack.java similarity index 93% rename from src/main/java/com/javaedge/concurrency/cas/demo/ConcurrentStack.java rename to concurrency/src/main/java/com/javaedge/concurrency/cas/demo/ConcurrentStack.java index 97e53e9..bcc7fa5 100755 --- a/src/main/java/com/javaedge/concurrency/cas/demo/ConcurrentStack.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/cas/demo/ConcurrentStack.java @@ -1,6 +1,4 @@ -package main.java.com.javaedge.concurrency.cas.demo; - -import com.javaedge.concurrency.cas.demo.Node; +package com.study.lock.cas.demo; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicStampedReference; diff --git a/src/main/java/com/javaedge/concurrency/cas/demo/Node.java b/concurrency/src/main/java/com/javaedge/concurrency/cas/demo/Node.java similarity index 85% rename from src/main/java/com/javaedge/concurrency/cas/demo/Node.java rename to concurrency/src/main/java/com/javaedge/concurrency/cas/demo/Node.java index 14a1fa4..8efedc0 100755 --- a/src/main/java/com/javaedge/concurrency/cas/demo/Node.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/cas/demo/Node.java @@ -1,4 +1,4 @@ -package main.java.com.javaedge.concurrency.cas.demo; +package com.javaedge.concurrency.cas.demo; /** * 存储在栈里面元素 -- 对象 diff --git a/src/main/java/com/javaedge/concurrency/cas/demo/Stack.java b/concurrency/src/main/java/com/javaedge/concurrency/cas/demo/Stack.java similarity index 96% rename from src/main/java/com/javaedge/concurrency/cas/demo/Stack.java rename to concurrency/src/main/java/com/javaedge/concurrency/cas/demo/Stack.java index 36b908e..f118e6c 100644 --- a/src/main/java/com/javaedge/concurrency/cas/demo/Stack.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/cas/demo/Stack.java @@ -1,4 +1,4 @@ -package main.java.com.javaedge.concurrency.cas.demo; +package com.javaedge.concurrency.cas.demo; import java.util.concurrent.TimeUnit; diff --git a/src/main/java/com/javaedge/concurrency/cas/demo/Test.java b/concurrency/src/main/java/com/javaedge/concurrency/cas/demo/Test.java similarity index 89% rename from src/main/java/com/javaedge/concurrency/cas/demo/Test.java rename to concurrency/src/main/java/com/javaedge/concurrency/cas/demo/Test.java index b90d2ac..026ab23 100755 --- a/src/main/java/com/javaedge/concurrency/cas/demo/Test.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/cas/demo/Test.java @@ -1,7 +1,4 @@ -package main.java.com.javaedge.concurrency.cas.demo; - -import com.javaedge.concurrency.cas.demo.Node; -import main.java.com.javaedge.concurrency.cas.demo.Stack; +package com.study.lock.cas.demo; public class Test { public static void main(String[] args) throws InterruptedException { diff --git a/src/main/java/com/javaedge/concurrency/common/closure/ThreadClosure.java b/concurrency/src/main/java/com/javaedge/concurrency/common/closure/ThreadClosure.java similarity index 95% rename from src/main/java/com/javaedge/concurrency/common/closure/ThreadClosure.java rename to concurrency/src/main/java/com/javaedge/concurrency/common/closure/ThreadClosure.java index eecd77a..d803764 100644 --- a/src/main/java/com/javaedge/concurrency/common/closure/ThreadClosure.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/common/closure/ThreadClosure.java @@ -1,4 +1,4 @@ -package main.java.com.javaedge.concurrency.common.closure; +package com.javaedge.concurrency.common.closure; import org.testng.annotations.Test; diff --git a/src/main/java/com/javaedge/concurrency/common/communication/ThreadCommunication.java b/concurrency/src/main/java/com/javaedge/concurrency/common/communication/ThreadCommunication.java similarity index 94% rename from src/main/java/com/javaedge/concurrency/common/communication/ThreadCommunication.java rename to concurrency/src/main/java/com/javaedge/concurrency/common/communication/ThreadCommunication.java index ba94398..a284135 100644 --- a/src/main/java/com/javaedge/concurrency/common/communication/ThreadCommunication.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/common/communication/ThreadCommunication.java @@ -1,12 +1,11 @@ -package main.java.com.javaedge.concurrency.common.communication; +package com.javaedge.concurrency.common.communication; import java.util.concurrent.locks.LockSupport; -import org.junit.Test; +import org.testng.annotations.Test; /** * 三种线程协作通信的方式:suspend/resume、wait/notify、park/unpark - * 原理文档:https://javaedge.blog.csdn.net/article/details/102345871 * * @author JavaEdge * @date 2019/10/8 @@ -41,8 +40,7 @@ public void suspendResumeTest() throws Exception { } /** - * 死锁的suspend/resume - * suspend并不会像wait一样释放锁,容易写出死锁代码 + * 死锁的suspend/resume。 suspend并不会像wait一样释放锁,容易写出死锁代码 */ @Test public void suspendResumeDeadLockTest() throws Exception { @@ -110,7 +108,6 @@ public void waitNotifyTest() throws Exception { try { System.out.println("1、进入等待"); this.wait(); - System.out.println("wait 结束!"); } catch (InterruptedException e) { e.printStackTrace(); } @@ -167,15 +164,14 @@ public void waitNotifyDeadLockTest() throws Exception { public void parkUnparkTest() throws Exception { // 启动线程 Thread consumerThread = new Thread(() -> { - // 如果没包子,则进入等待 - if (bunShop == null) { + if (bunShop == null) { // 如果没包子,则进入等待 System.out.println("1、进入等待"); LockSupport.park(); } System.out.println("2、买到包子,回家"); }); consumerThread.start(); - // 3s后,生产一个包子 + // 3秒之后,生产一个包子 Thread.sleep(3000L); bunShop = new Object(); LockSupport.unpark(consumerThread); diff --git a/src/main/java/com/javaedge/concurrency/common/state/ThreadState.java b/concurrency/src/main/java/com/javaedge/concurrency/common/state/ThreadState.java similarity index 97% rename from src/main/java/com/javaedge/concurrency/common/state/ThreadState.java rename to concurrency/src/main/java/com/javaedge/concurrency/common/state/ThreadState.java index f123ad2..e5172af 100644 --- a/src/main/java/com/javaedge/concurrency/common/state/ThreadState.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/common/state/ThreadState.java @@ -1,7 +1,7 @@ -package main.java.com.javaedge.concurrency.common.state; +package com.javaedge.concurrency.common.state; /** - * 多线程运行状态切换 + * 多线程运行状态切换示例 * * @author JavaEdge * @date 2019/8/26 diff --git a/src/main/java/com/javaedge/concurrency/common/stop/FlagStopThread.java b/concurrency/src/main/java/com/javaedge/concurrency/common/stop/FlagStopThread.java similarity index 84% rename from src/main/java/com/javaedge/concurrency/common/stop/FlagStopThread.java rename to concurrency/src/main/java/com/javaedge/concurrency/common/stop/FlagStopThread.java index 7201e65..8cfe920 100644 --- a/src/main/java/com/javaedge/concurrency/common/stop/FlagStopThread.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/common/stop/FlagStopThread.java @@ -1,4 +1,4 @@ -package main.java.com.javaedge.concurrency.common.stop; +package com.javaedge.concurrency.common.stop; /** * 通过状态位来判断 @@ -7,7 +7,6 @@ * @date 2019/8/29 */ public class FlagStopThread extends Thread { - public volatile static boolean flag = true; public static void main(String[] args) throws InterruptedException { @@ -21,7 +20,7 @@ public static void main(String[] args) throws InterruptedException { e.printStackTrace(); } }).start(); - // 3s后,将状态标志改为False,代表不继续运行 + // 3秒之后,将状态标志改为False,代表不继续运行 Thread.sleep(3000L); flag = false; System.out.println("程序运行结束"); diff --git a/src/main/java/com/javaedge/concurrency/common/stop/StopThread.java b/concurrency/src/main/java/com/javaedge/concurrency/common/stop/StopThread.java similarity index 73% rename from src/main/java/com/javaedge/concurrency/common/stop/StopThread.java rename to concurrency/src/main/java/com/javaedge/concurrency/common/stop/StopThread.java index 501b5b0..3dfbd36 100755 --- a/src/main/java/com/javaedge/concurrency/common/stop/StopThread.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/common/stop/StopThread.java @@ -1,6 +1,8 @@ -package main.java.com.javaedge.concurrency.common.stop; +package com.javaedge.concurrency.common.stop; /** + * 线程stop强制性中止,破坏线程安全的示例 + * * @author JavaEdge * @date 2019/8/26 */ @@ -13,7 +15,7 @@ public void run() { // 增加同步锁,确保线程安全 ++i; try { - // 休眠10s,模拟耗时操作 + // 休眠10秒,模拟耗时操作 Thread.sleep(10000); } catch (InterruptedException e) { e.printStackTrace(); @@ -22,6 +24,9 @@ public void run() { } } + /** + * 打印i和j + */ public void print() { System.out.println("i=" + i + " j=" + j); } diff --git a/src/main/java/com/javaedge/concurrency/common/stop/ThreadStop.java b/concurrency/src/main/java/com/javaedge/concurrency/common/stop/ThreadStop.java similarity index 65% rename from src/main/java/com/javaedge/concurrency/common/stop/ThreadStop.java rename to concurrency/src/main/java/com/javaedge/concurrency/common/stop/ThreadStop.java index 6fe9aca..288e5a9 100644 --- a/src/main/java/com/javaedge/concurrency/common/stop/ThreadStop.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/common/stop/ThreadStop.java @@ -1,6 +1,8 @@ -package main.java.com.javaedge.concurrency.common.stop; +package com.javaedge.concurrency.common.stop; /** + * 线程stop强制性中止,破坏线程安全的示例 + * * @author JavaEdge * @date 2019/8/26 */ @@ -10,11 +12,9 @@ public static void main(String[] args) throws InterruptedException { thread.start(); // 休眠1秒,确保i变量自增成功 Thread.sleep(1000); - // 错误的终止 线程stop强制性中止,破坏线程安全 -// thread.stop(); - - // 正确的终止 - thread.interrupt(); + // 暂停线程 + // thread.stop(); // 错误的终止 + thread.interrupt(); // 正确的终止 while (thread.isAlive()) { // 确保线程已经终止 } // 输出结果 diff --git a/src/main/java/com/javaedge/concurrency/common/volatiletest/VisibilityDemo.java b/concurrency/src/main/java/com/javaedge/concurrency/common/volatiletest/VisibilityDemo.java similarity index 96% rename from src/main/java/com/javaedge/concurrency/common/volatiletest/VisibilityDemo.java rename to concurrency/src/main/java/com/javaedge/concurrency/common/volatiletest/VisibilityDemo.java index 5247ab5..085d1d8 100644 --- a/src/main/java/com/javaedge/concurrency/common/volatiletest/VisibilityDemo.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/common/volatiletest/VisibilityDemo.java @@ -1,4 +1,4 @@ -package main.java.com.javaedge.concurrency.common.volatiletest; +package com.javaedge.concurrency.common.volatiletest; /** * @author JavaEdge diff --git a/src/main/java/com/javaedge/concurrency/common/volatiletest/VisibilityDemo1.java b/concurrency/src/main/java/com/javaedge/concurrency/common/volatiletest/VisibilityDemo1.java similarity index 93% rename from src/main/java/com/javaedge/concurrency/common/volatiletest/VisibilityDemo1.java rename to concurrency/src/main/java/com/javaedge/concurrency/common/volatiletest/VisibilityDemo1.java index 8956eb2..19169ba 100755 --- a/src/main/java/com/javaedge/concurrency/common/volatiletest/VisibilityDemo1.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/common/volatiletest/VisibilityDemo1.java @@ -1,4 +1,4 @@ -package main.java.com.javaedge.concurrency.common.volatiletest; +package com.javaedge.concurrency.common.volatiletest; import java.util.concurrent.TimeUnit; diff --git a/src/main/java/com/javaedge/concurrency/common/volatiletest/VisibilityDemo2.java b/concurrency/src/main/java/com/javaedge/concurrency/common/volatiletest/VisibilityDemo2.java similarity index 94% rename from src/main/java/com/javaedge/concurrency/common/volatiletest/VisibilityDemo2.java rename to concurrency/src/main/java/com/javaedge/concurrency/common/volatiletest/VisibilityDemo2.java index 04bb23a..edf43d4 100755 --- a/src/main/java/com/javaedge/concurrency/common/volatiletest/VisibilityDemo2.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/common/volatiletest/VisibilityDemo2.java @@ -1,4 +1,4 @@ -package main.java.com.javaedge.concurrency.common.volatiletest; +package com.javaedge.concurrency.common.volatiletest; import java.util.concurrent.TimeUnit; diff --git a/src/main/java/com/javaedge/concurrency/aqs/CountDownLatchExample1.java b/concurrency/src/main/java/com/javaedge/concurrency/example/aqs/CountDownLatchExample1.java similarity index 95% rename from src/main/java/com/javaedge/concurrency/aqs/CountDownLatchExample1.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/aqs/CountDownLatchExample1.java index 7cbc186..ce28dda 100755 --- a/src/main/java/com/javaedge/concurrency/aqs/CountDownLatchExample1.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/aqs/CountDownLatchExample1.java @@ -1,4 +1,4 @@ -package main.java.com.javaedge.concurrency.aqs; +package com.javaedge.concurrency.example.aqs; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/com/javaedge/concurrency/aqs/CountDownLatchExample2.java b/concurrency/src/main/java/com/javaedge/concurrency/example/aqs/CountDownLatchExample2.java similarity index 95% rename from src/main/java/com/javaedge/concurrency/aqs/CountDownLatchExample2.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/aqs/CountDownLatchExample2.java index 2ae325e..65dacf0 100755 --- a/src/main/java/com/javaedge/concurrency/aqs/CountDownLatchExample2.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/aqs/CountDownLatchExample2.java @@ -1,4 +1,4 @@ -package main.java.com.javaedge.concurrency.aqs; +package com.javaedge.concurrency.example.aqs; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/com/javaedge/concurrency/aqs/CyclicBarrierExample1.java b/concurrency/src/main/java/com/javaedge/concurrency/example/aqs/CyclicBarrierExample1.java similarity index 95% rename from src/main/java/com/javaedge/concurrency/aqs/CyclicBarrierExample1.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/aqs/CyclicBarrierExample1.java index 694afd5..f117926 100755 --- a/src/main/java/com/javaedge/concurrency/aqs/CyclicBarrierExample1.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/aqs/CyclicBarrierExample1.java @@ -1,4 +1,4 @@ -package main.java.com.javaedge.concurrency.aqs; +package com.javaedge.concurrency.example.aqs; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/com/javaedge/concurrency/aqs/CyclicBarrierExample2.java b/concurrency/src/main/java/com/javaedge/concurrency/example/aqs/CyclicBarrierExample2.java similarity index 96% rename from src/main/java/com/javaedge/concurrency/aqs/CyclicBarrierExample2.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/aqs/CyclicBarrierExample2.java index 3894267..19024d8 100755 --- a/src/main/java/com/javaedge/concurrency/aqs/CyclicBarrierExample2.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/aqs/CyclicBarrierExample2.java @@ -1,4 +1,4 @@ -package main.java.com.javaedge.concurrency.aqs; +package com.javaedge.concurrency.example.aqs; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/com/javaedge/concurrency/aqs/CyclicBarrierExample3.java b/concurrency/src/main/java/com/javaedge/concurrency/example/aqs/CyclicBarrierExample3.java similarity index 95% rename from src/main/java/com/javaedge/concurrency/aqs/CyclicBarrierExample3.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/aqs/CyclicBarrierExample3.java index 18f0926..90663bc 100755 --- a/src/main/java/com/javaedge/concurrency/aqs/CyclicBarrierExample3.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/aqs/CyclicBarrierExample3.java @@ -1,4 +1,4 @@ -package main.java.com.javaedge.concurrency.aqs; +package com.javaedge.concurrency.example.aqs; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/com/javaedge/concurrency/forkjoin/ForkJoinTaskExample.java b/concurrency/src/main/java/com/javaedge/concurrency/example/aqs/ForkJoinTaskExample.java similarity index 86% rename from src/main/java/com/javaedge/concurrency/forkjoin/ForkJoinTaskExample.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/aqs/ForkJoinTaskExample.java index 58b2c59..5380f90 100755 --- a/src/main/java/com/javaedge/concurrency/forkjoin/ForkJoinTaskExample.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/aqs/ForkJoinTaskExample.java @@ -1,4 +1,4 @@ -package main.java.com.javaedge.concurrency.forkjoin; +package com.javaedge.concurrency.example.aqs; import lombok.extern.slf4j.Slf4j; @@ -6,13 +6,10 @@ import java.util.concurrent.Future; import java.util.concurrent.RecursiveTask; -/** - * @author JavaEdge - */ @Slf4j public class ForkJoinTaskExample extends RecursiveTask { - public static final int THRESHOLD = 2; + public static final int threshold = 2; private int start; private int end; @@ -26,7 +23,7 @@ protected Integer compute() { int sum = 0; //如果任务足够小就计算任务 - boolean canCompute = (end - start) <= THRESHOLD; + boolean canCompute = (end - start) <= threshold; if (canCompute) { for (int i = start; i <= end; i++) { sum += i; @@ -54,10 +51,10 @@ protected Integer compute() { public static void main(String[] args) { ForkJoinPool forkjoinPool = new ForkJoinPool(); - // 生成一个计算任务,计算1+2+3+4 + //生成一个计算任务,计算1+2+3+4 ForkJoinTaskExample task = new ForkJoinTaskExample(1, 100); - // 执行一个任务 + //执行一个任务 Future result = forkjoinPool.submit(task); try { diff --git a/src/main/java/com/javaedge/concurrency/furure/jdk/FutureExample.java b/concurrency/src/main/java/com/javaedge/concurrency/example/aqs/FutureExample.java similarity index 91% rename from src/main/java/com/javaedge/concurrency/furure/jdk/FutureExample.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/aqs/FutureExample.java index 68623dc..54781b7 100755 --- a/src/main/java/com/javaedge/concurrency/furure/jdk/FutureExample.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/aqs/FutureExample.java @@ -1,4 +1,4 @@ -package main.java.com.javaedge.concurrency.furure.jdk; +package com.javaedge.concurrency.example.aqs; import lombok.extern.slf4j.Slf4j; @@ -7,9 +7,6 @@ import java.util.concurrent.Executors; import java.util.concurrent.Future; -/** - * @author JavaEdge - */ @Slf4j public class FutureExample { diff --git a/src/main/java/com/javaedge/concurrency/furure/jdk/FutureTaskExample.java b/concurrency/src/main/java/com/javaedge/concurrency/example/aqs/FutureTaskExample.java similarity index 78% rename from src/main/java/com/javaedge/concurrency/furure/jdk/FutureTaskExample.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/aqs/FutureTaskExample.java index 9f7f70e..2d41e2d 100755 --- a/src/main/java/com/javaedge/concurrency/furure/jdk/FutureTaskExample.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/aqs/FutureTaskExample.java @@ -1,18 +1,14 @@ -package main.java.com.javaedge.concurrency.furure.jdk; +package com.javaedge.concurrency.example.aqs; import lombok.extern.slf4j.Slf4j; import java.util.concurrent.Callable; import java.util.concurrent.FutureTask; -/** - * @author JavaEdge - */ @Slf4j public class FutureTaskExample { public static void main(String[] args) throws Exception { - // 创建异步任务 FutureTask futureTask = new FutureTask(new Callable() { @Override public String call() throws Exception { @@ -21,11 +17,10 @@ public String call() throws Exception { return "Done"; } }); - // 启动线程 + new Thread(futureTask).start(); log.info("do something in main"); Thread.sleep(1000); - // 【阻塞】等待任务执行完毕,并返回结果 String result = futureTask.get(); log.info("result:{}", result); } diff --git a/src/main/java/com/javaedge/concurrency/aqs/semaphore/SemaphoreExample1.java b/concurrency/src/main/java/com/javaedge/concurrency/example/aqs/SemaphoreExample1.java similarity index 83% rename from src/main/java/com/javaedge/concurrency/aqs/semaphore/SemaphoreExample1.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/aqs/SemaphoreExample1.java index bcf563b..62c25e2 100755 --- a/src/main/java/com/javaedge/concurrency/aqs/semaphore/SemaphoreExample1.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/aqs/SemaphoreExample1.java @@ -1,18 +1,16 @@ -package main.java.com.javaedge.concurrency.aqs.semaphore; +package com.javaedge.concurrency.example.aqs; import lombok.extern.slf4j.Slf4j; +import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Semaphore; -/** - * @author JavaEdge - */ @Slf4j public class SemaphoreExample1 { - private final static int THREAD_COUNT = 20; + private final static int threadCount = 20; public static void main(String[] args) throws Exception { @@ -20,7 +18,7 @@ public static void main(String[] args) throws Exception { final Semaphore semaphore = new Semaphore(3); - for (int i = 0; i < THREAD_COUNT; i++) { + for (int i = 0; i < threadCount; i++) { final int threadNum = i; exec.execute(() -> { try { diff --git a/src/main/java/com/javaedge/concurrency/aqs/semaphore/SemaphoreExample2.java b/concurrency/src/main/java/com/javaedge/concurrency/example/aqs/SemaphoreExample2.java similarity index 94% rename from src/main/java/com/javaedge/concurrency/aqs/semaphore/SemaphoreExample2.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/aqs/SemaphoreExample2.java index b3c55b3..47ce2b4 100755 --- a/src/main/java/com/javaedge/concurrency/aqs/semaphore/SemaphoreExample2.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/aqs/SemaphoreExample2.java @@ -1,4 +1,4 @@ -package main.java.com.javaedge.concurrency.aqs.semaphore; +package com.javaedge.concurrency.example.aqs; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/com/javaedge/concurrency/aqs/semaphore/SemaphoreExample3.java b/concurrency/src/main/java/com/javaedge/concurrency/example/aqs/SemaphoreExample3.java similarity index 92% rename from src/main/java/com/javaedge/concurrency/aqs/semaphore/SemaphoreExample3.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/aqs/SemaphoreExample3.java index f9fe06d..9c0ebb7 100755 --- a/src/main/java/com/javaedge/concurrency/aqs/semaphore/SemaphoreExample3.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/aqs/SemaphoreExample3.java @@ -1,10 +1,11 @@ -package main.java.com.javaedge.concurrency.aqs.semaphore; +package com.javaedge.concurrency.example.aqs; import lombok.extern.slf4j.Slf4j; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Semaphore; +import java.util.concurrent.TimeUnit; @Slf4j public class SemaphoreExample3 { diff --git a/src/main/java/com/javaedge/concurrency/aqs/semaphore/SemaphoreExample4.java b/concurrency/src/main/java/com/javaedge/concurrency/example/aqs/SemaphoreExample4.java similarity index 95% rename from src/main/java/com/javaedge/concurrency/aqs/semaphore/SemaphoreExample4.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/aqs/SemaphoreExample4.java index 29a3658..c73e5af 100755 --- a/src/main/java/com/javaedge/concurrency/aqs/semaphore/SemaphoreExample4.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/aqs/SemaphoreExample4.java @@ -1,4 +1,4 @@ -package main.java.com.javaedge.concurrency.aqs.semaphore; +package com.javaedge.concurrency.example.aqs; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/com/javaedge/concurrency/atomic/AtomicExample1.java b/concurrency/src/main/java/com/javaedge/concurrency/example/atomic/AtomicExample1.java similarity index 92% rename from src/main/java/com/javaedge/concurrency/atomic/AtomicExample1.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/atomic/AtomicExample1.java index f309866..eaba128 100755 --- a/src/main/java/com/javaedge/concurrency/atomic/AtomicExample1.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/atomic/AtomicExample1.java @@ -1,6 +1,6 @@ -package main.java.com.javaedge.concurrency.atomic; +package com.javaedge.concurrency.example.atomic; -import main.java.com.javaedge.concurrency.annoations.ThreadSafe; +import com.javaedge.concurrency.annoations.ThreadSafe; import lombok.extern.slf4j.Slf4j; import java.util.concurrent.CountDownLatch; diff --git a/src/main/java/com/javaedge/concurrency/atomic/AtomicExample2.java b/concurrency/src/main/java/com/javaedge/concurrency/example/atomic/AtomicExample2.java similarity index 92% rename from src/main/java/com/javaedge/concurrency/atomic/AtomicExample2.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/atomic/AtomicExample2.java index 42aed35..452bfb4 100755 --- a/src/main/java/com/javaedge/concurrency/atomic/AtomicExample2.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/atomic/AtomicExample2.java @@ -1,6 +1,6 @@ -package main.java.com.javaedge.concurrency.atomic; +package com.javaedge.concurrency.example.atomic; -import main.java.com.javaedge.concurrency.annoations.ThreadSafe; +import com.javaedge.concurrency.annoations.ThreadSafe; import lombok.extern.slf4j.Slf4j; import java.util.concurrent.CountDownLatch; diff --git a/src/main/java/com/javaedge/concurrency/atomic/AtomicExample3.java b/concurrency/src/main/java/com/javaedge/concurrency/example/atomic/AtomicExample3.java similarity index 92% rename from src/main/java/com/javaedge/concurrency/atomic/AtomicExample3.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/atomic/AtomicExample3.java index ece69ca..c6e20d3 100755 --- a/src/main/java/com/javaedge/concurrency/atomic/AtomicExample3.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/atomic/AtomicExample3.java @@ -1,6 +1,6 @@ -package main.java.com.javaedge.concurrency.atomic; +package com.javaedge.concurrency.example.atomic; -import main.java.com.javaedge.concurrency.annoations.ThreadSafe; +import com.javaedge.concurrency.annoations.ThreadSafe; import lombok.extern.slf4j.Slf4j; import java.util.concurrent.CountDownLatch; diff --git a/src/main/java/com/javaedge/concurrency/atomic/AtomicExample4.java b/concurrency/src/main/java/com/javaedge/concurrency/example/atomic/AtomicExample4.java similarity index 81% rename from src/main/java/com/javaedge/concurrency/atomic/AtomicExample4.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/atomic/AtomicExample4.java index 1238f30..d2b3c25 100755 --- a/src/main/java/com/javaedge/concurrency/atomic/AtomicExample4.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/atomic/AtomicExample4.java @@ -1,6 +1,6 @@ -package main.java.com.javaedge.concurrency.atomic; +package com.javaedge.concurrency.example.atomic; -import main.java.com.javaedge.concurrency.annoations.ThreadSafe; +import com.javaedge.concurrency.annoations.ThreadSafe; import lombok.extern.slf4j.Slf4j; import java.util.concurrent.atomic.AtomicReference; diff --git a/src/main/java/com/javaedge/concurrency/atomic/AtomicExample5.java b/concurrency/src/main/java/com/javaedge/concurrency/example/atomic/AtomicExample5.java similarity index 87% rename from src/main/java/com/javaedge/concurrency/atomic/AtomicExample5.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/atomic/AtomicExample5.java index 0c37a22..f4cc64c 100755 --- a/src/main/java/com/javaedge/concurrency/atomic/AtomicExample5.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/atomic/AtomicExample5.java @@ -1,6 +1,6 @@ -package main.java.com.javaedge.concurrency.atomic; +package com.javaedge.concurrency.example.atomic; -import main.java.com.javaedge.concurrency.annoations.ThreadSafe; +import com.javaedge.concurrency.annoations.ThreadSafe; import lombok.Getter; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/com/javaedge/concurrency/atomic/AtomicExample6.java b/concurrency/src/main/java/com/javaedge/concurrency/example/atomic/AtomicExample6.java similarity index 92% rename from src/main/java/com/javaedge/concurrency/atomic/AtomicExample6.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/atomic/AtomicExample6.java index b5a4f7b..7d37d40 100755 --- a/src/main/java/com/javaedge/concurrency/atomic/AtomicExample6.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/atomic/AtomicExample6.java @@ -1,6 +1,6 @@ -package main.java.com.javaedge.concurrency.atomic; +package com.javaedge.concurrency.example.atomic; -import main.java.com.javaedge.concurrency.annoations.ThreadSafe; +import com.javaedge.concurrency.annoations.ThreadSafe; import lombok.extern.slf4j.Slf4j; import java.util.concurrent.CountDownLatch; diff --git a/src/main/java/com/javaedge/concurrency/atomic/AtomicTest.java b/concurrency/src/main/java/com/javaedge/concurrency/example/atomic/AtomicTest.java similarity index 92% rename from src/main/java/com/javaedge/concurrency/atomic/AtomicTest.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/atomic/AtomicTest.java index 8cbc04a..5293174 100755 --- a/src/main/java/com/javaedge/concurrency/atomic/AtomicTest.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/atomic/AtomicTest.java @@ -1,4 +1,4 @@ -package main.java.com.javaedge.concurrency.atomic; +package com.javaedge.concurrency.example.atomic; import java.util.concurrent.atomic.AtomicInteger; diff --git a/src/main/java/com/javaedge/concurrency/atomic/LockCASDemo.java b/concurrency/src/main/java/com/javaedge/concurrency/example/atomic/LockCASDemo.java similarity index 97% rename from src/main/java/com/javaedge/concurrency/atomic/LockCASDemo.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/atomic/LockCASDemo.java index e7c03d9..9c0e3d8 100644 --- a/src/main/java/com/javaedge/concurrency/atomic/LockCASDemo.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/atomic/LockCASDemo.java @@ -1,4 +1,4 @@ -package main.java.com.javaedge.concurrency.atomic; +package com.javaedge.concurrency.example.atomic; import sun.misc.Unsafe; diff --git a/src/main/java/com/javaedge/concurrency/atomic/LongAccumulatorDemo.java b/concurrency/src/main/java/com/javaedge/concurrency/example/atomic/LongAccumulatorDemo.java similarity index 95% rename from src/main/java/com/javaedge/concurrency/atomic/LongAccumulatorDemo.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/atomic/LongAccumulatorDemo.java index d78dc47..dcdf135 100755 --- a/src/main/java/com/javaedge/concurrency/atomic/LongAccumulatorDemo.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/atomic/LongAccumulatorDemo.java @@ -1,4 +1,4 @@ -package main.java.com.javaedge.concurrency.atomic; +package com.javaedge.concurrency.example.atomic; import java.util.concurrent.atomic.LongAccumulator; import java.util.function.LongBinaryOperator; diff --git a/src/main/java/com/javaedge/concurrency/atomic/LongAdderDemo.java b/concurrency/src/main/java/com/javaedge/concurrency/example/atomic/LongAdderDemo.java similarity index 97% rename from src/main/java/com/javaedge/concurrency/atomic/LongAdderDemo.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/atomic/LongAdderDemo.java index b415904..16927b1 100755 --- a/src/main/java/com/javaedge/concurrency/atomic/LongAdderDemo.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/atomic/LongAdderDemo.java @@ -1,4 +1,4 @@ -package main.java.com.javaedge.concurrency.atomic; +package com.javaedge.concurrency.example.atomic; import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.atomic.LongAdder; diff --git a/src/main/java/com/javaedge/concurrency/cache/CacheController.java b/concurrency/src/main/java/com/javaedge/concurrency/example/cache/CacheController.java similarity index 94% rename from src/main/java/com/javaedge/concurrency/cache/CacheController.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/cache/CacheController.java index 321d024..1eb5898 100755 --- a/src/main/java/com/javaedge/concurrency/cache/CacheController.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/cache/CacheController.java @@ -1,4 +1,4 @@ -package main.java.com.javaedge.concurrency.cache; +package com.javaedge.concurrency.example.cache; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; diff --git a/src/main/java/com/javaedge/concurrency/cache/GuavaCacheExample1.java b/concurrency/src/main/java/com/javaedge/concurrency/example/cache/GuavaCacheExample1.java similarity index 97% rename from src/main/java/com/javaedge/concurrency/cache/GuavaCacheExample1.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/cache/GuavaCacheExample1.java index 09d2bad..e66ca99 100755 --- a/src/main/java/com/javaedge/concurrency/cache/GuavaCacheExample1.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/cache/GuavaCacheExample1.java @@ -1,4 +1,4 @@ -package com.javaedge.concurrency.cache; +package com.javaedge.concurrency.example.cache; import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; diff --git a/src/main/java/com/javaedge/concurrency/cache/GuavaCacheExample2.java b/concurrency/src/main/java/com/javaedge/concurrency/example/cache/GuavaCacheExample2.java similarity index 97% rename from src/main/java/com/javaedge/concurrency/cache/GuavaCacheExample2.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/cache/GuavaCacheExample2.java index 5548124..9c192ab 100755 --- a/src/main/java/com/javaedge/concurrency/cache/GuavaCacheExample2.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/cache/GuavaCacheExample2.java @@ -1,4 +1,4 @@ -package main.java.com.javaedge.concurrency.cache; +package com.javaedge.concurrency.example.cache; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; diff --git a/src/main/java/com/javaedge/concurrency/cache/RedisClient.java b/concurrency/src/main/java/com/javaedge/concurrency/example/cache/RedisClient.java similarity index 94% rename from src/main/java/com/javaedge/concurrency/cache/RedisClient.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/cache/RedisClient.java index d985089..cf12169 100755 --- a/src/main/java/com/javaedge/concurrency/cache/RedisClient.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/cache/RedisClient.java @@ -1,4 +1,4 @@ -package main.java.com.javaedge.concurrency.cache; +package com.javaedge.concurrency.example.cache; import org.springframework.stereotype.Component; import redis.clients.jedis.Jedis; diff --git a/src/main/java/com/javaedge/concurrency/cache/RedisConfig.java b/concurrency/src/main/java/com/javaedge/concurrency/example/cache/RedisConfig.java similarity index 90% rename from src/main/java/com/javaedge/concurrency/cache/RedisConfig.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/cache/RedisConfig.java index 7b7aaed..1100ff7 100755 --- a/src/main/java/com/javaedge/concurrency/cache/RedisConfig.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/cache/RedisConfig.java @@ -1,4 +1,4 @@ -package main.java.com.javaedge.concurrency.cache; +package com.javaedge.concurrency.example.cache; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; diff --git a/src/main/java/com/javaedge/concurrency/commonunsafe/ArrayListExample.java b/concurrency/src/main/java/com/javaedge/concurrency/example/commonUnsafe/ArrayListExample.java similarity index 96% rename from src/main/java/com/javaedge/concurrency/commonunsafe/ArrayListExample.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/commonUnsafe/ArrayListExample.java index 29541aa..b6c4b04 100755 --- a/src/main/java/com/javaedge/concurrency/commonunsafe/ArrayListExample.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/commonUnsafe/ArrayListExample.java @@ -1,4 +1,4 @@ -package main.java.com.javaedge.concurrency.commonunsafe; +package com.javaedge.concurrency.example.commonUnsafe; import com.javaedge.concurrency.annoations.NotThreadSafe; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/com/javaedge/concurrency/commonunsafe/DateFormatExample1.java b/concurrency/src/main/java/com/javaedge/concurrency/example/commonUnsafe/DateFormatExample1.java similarity index 96% rename from src/main/java/com/javaedge/concurrency/commonunsafe/DateFormatExample1.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/commonUnsafe/DateFormatExample1.java index bceba91..e560455 100755 --- a/src/main/java/com/javaedge/concurrency/commonunsafe/DateFormatExample1.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/commonUnsafe/DateFormatExample1.java @@ -1,4 +1,4 @@ -package main.java.com.javaedge.concurrency.commonunsafe; +package com.javaedge.concurrency.example.commonUnsafe; import com.javaedge.concurrency.annoations.NotThreadSafe; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/com/javaedge/concurrency/commonunsafe/DateFormatExample2.java b/concurrency/src/main/java/com/javaedge/concurrency/example/commonUnsafe/DateFormatExample2.java similarity index 96% rename from src/main/java/com/javaedge/concurrency/commonunsafe/DateFormatExample2.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/commonUnsafe/DateFormatExample2.java index 809e505..cfdcad9 100755 --- a/src/main/java/com/javaedge/concurrency/commonunsafe/DateFormatExample2.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/commonUnsafe/DateFormatExample2.java @@ -1,4 +1,4 @@ -package main.java.com.javaedge.concurrency.commonunsafe; +package com.javaedge.concurrency.example.commonUnsafe; import com.javaedge.concurrency.annoations.ThreadSafe; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/com/javaedge/concurrency/commonunsafe/DateFormatExample3.java b/concurrency/src/main/java/com/javaedge/concurrency/example/commonUnsafe/DateFormatExample3.java similarity index 96% rename from src/main/java/com/javaedge/concurrency/commonunsafe/DateFormatExample3.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/commonUnsafe/DateFormatExample3.java index 8057e44..c23d5fb 100755 --- a/src/main/java/com/javaedge/concurrency/commonunsafe/DateFormatExample3.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/commonUnsafe/DateFormatExample3.java @@ -1,4 +1,4 @@ -package main.java.com.javaedge.concurrency.commonunsafe; +package com.javaedge.concurrency.example.commonUnsafe; import com.javaedge.concurrency.annoations.ThreadSafe; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/com/javaedge/concurrency/commonunsafe/HashMapExample.java b/concurrency/src/main/java/com/javaedge/concurrency/example/commonUnsafe/HashMapExample.java similarity index 96% rename from src/main/java/com/javaedge/concurrency/commonunsafe/HashMapExample.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/commonUnsafe/HashMapExample.java index b6eb68b..0220ee6 100755 --- a/src/main/java/com/javaedge/concurrency/commonunsafe/HashMapExample.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/commonUnsafe/HashMapExample.java @@ -1,4 +1,4 @@ -package main.java.com.javaedge.concurrency.commonunsafe; +package com.javaedge.concurrency.example.commonUnsafe; import com.javaedge.concurrency.annoations.NotThreadSafe; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/com/javaedge/concurrency/commonunsafe/HashSetExample.java b/concurrency/src/main/java/com/javaedge/concurrency/example/commonUnsafe/HashSetExample.java similarity index 96% rename from src/main/java/com/javaedge/concurrency/commonunsafe/HashSetExample.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/commonUnsafe/HashSetExample.java index 69b9a57..8d1c90c 100755 --- a/src/main/java/com/javaedge/concurrency/commonunsafe/HashSetExample.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/commonUnsafe/HashSetExample.java @@ -1,4 +1,4 @@ -package main.java.com.javaedge.concurrency.commonunsafe; +package com.javaedge.concurrency.example.commonUnsafe; import com.javaedge.concurrency.annoations.NotThreadSafe; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/com/javaedge/concurrency/commonunsafe/StringExample1.java b/concurrency/src/main/java/com/javaedge/concurrency/example/commonUnsafe/StringExample1.java similarity index 96% rename from src/main/java/com/javaedge/concurrency/commonunsafe/StringExample1.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/commonUnsafe/StringExample1.java index e445ff8..fc41eb8 100755 --- a/src/main/java/com/javaedge/concurrency/commonunsafe/StringExample1.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/commonUnsafe/StringExample1.java @@ -1,4 +1,4 @@ -package main.java.com.javaedge.concurrency.commonunsafe; +package com.javaedge.concurrency.example.commonUnsafe; import com.javaedge.concurrency.annoations.NotThreadSafe; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/com/javaedge/concurrency/commonunsafe/StringExample2.java b/concurrency/src/main/java/com/javaedge/concurrency/example/commonUnsafe/StringExample2.java similarity index 94% rename from src/main/java/com/javaedge/concurrency/commonunsafe/StringExample2.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/commonUnsafe/StringExample2.java index 00594c1..98c21ef 100755 --- a/src/main/java/com/javaedge/concurrency/commonunsafe/StringExample2.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/commonUnsafe/StringExample2.java @@ -1,4 +1,4 @@ -package main.java.com.javaedge.concurrency.commonunsafe; +package com.javaedge.concurrency.example.commonUnsafe; import com.javaedge.concurrency.annoations.ThreadSafe; import lombok.extern.slf4j.Slf4j; @@ -8,9 +8,6 @@ import java.util.concurrent.Executors; import java.util.concurrent.Semaphore; -/** - * @author JavaEdge - */ @Slf4j @ThreadSafe public class StringExample2 { diff --git a/src/main/java/com/javaedge/concurrency/concurrent/ConcurrentHashMapExample.java b/concurrency/src/main/java/com/javaedge/concurrency/example/concurrent/ConcurrentHashMapExample.java similarity index 96% rename from src/main/java/com/javaedge/concurrency/concurrent/ConcurrentHashMapExample.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/concurrent/ConcurrentHashMapExample.java index 4a7d217..b8c30c8 100755 --- a/src/main/java/com/javaedge/concurrency/concurrent/ConcurrentHashMapExample.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/concurrent/ConcurrentHashMapExample.java @@ -1,4 +1,4 @@ -package main.java.com.javaedge.concurrency.concurrent; +package com.javaedge.concurrency.example.concurrent; import com.javaedge.concurrency.annoations.ThreadSafe; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/com/javaedge/concurrency/concurrent/ConcurrentSkipListMapExample.java b/concurrency/src/main/java/com/javaedge/concurrency/example/concurrent/ConcurrentSkipListMapExample.java similarity index 96% rename from src/main/java/com/javaedge/concurrency/concurrent/ConcurrentSkipListMapExample.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/concurrent/ConcurrentSkipListMapExample.java index 1d39bd0..b81407e 100755 --- a/src/main/java/com/javaedge/concurrency/concurrent/ConcurrentSkipListMapExample.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/concurrent/ConcurrentSkipListMapExample.java @@ -1,4 +1,4 @@ -package main.java.com.javaedge.concurrency.concurrent; +package com.javaedge.concurrency.example.concurrent; import com.javaedge.concurrency.annoations.ThreadSafe; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/com/javaedge/concurrency/concurrent/ConcurrentSkipListSetExample.java b/concurrency/src/main/java/com/javaedge/concurrency/example/concurrent/ConcurrentSkipListSetExample.java similarity index 96% rename from src/main/java/com/javaedge/concurrency/concurrent/ConcurrentSkipListSetExample.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/concurrent/ConcurrentSkipListSetExample.java index b197d1b..1a1833c 100755 --- a/src/main/java/com/javaedge/concurrency/concurrent/ConcurrentSkipListSetExample.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/concurrent/ConcurrentSkipListSetExample.java @@ -1,4 +1,4 @@ -package main.java.com.javaedge.concurrency.concurrent; +package com.javaedge.concurrency.example.concurrent; import com.javaedge.concurrency.annoations.ThreadSafe; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/com/javaedge/concurrency/concurrent/CopyOnWriteArrayListExample.java b/concurrency/src/main/java/com/javaedge/concurrency/example/concurrent/CopyOnWriteArrayListExample.java similarity index 96% rename from src/main/java/com/javaedge/concurrency/concurrent/CopyOnWriteArrayListExample.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/concurrent/CopyOnWriteArrayListExample.java index de26588..a47d3d6 100755 --- a/src/main/java/com/javaedge/concurrency/concurrent/CopyOnWriteArrayListExample.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/concurrent/CopyOnWriteArrayListExample.java @@ -1,4 +1,4 @@ -package main.java.com.javaedge.concurrency.concurrent; +package com.javaedge.concurrency.example.concurrent; import com.javaedge.concurrency.annoations.ThreadSafe; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/com/javaedge/concurrency/concurrent/CopyOnWriteArraySetExample.java b/concurrency/src/main/java/com/javaedge/concurrency/example/concurrent/CopyOnWriteArraySetExample.java similarity index 96% rename from src/main/java/com/javaedge/concurrency/concurrent/CopyOnWriteArraySetExample.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/concurrent/CopyOnWriteArraySetExample.java index 7d9c882..29d6aad 100755 --- a/src/main/java/com/javaedge/concurrency/concurrent/CopyOnWriteArraySetExample.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/concurrent/CopyOnWriteArraySetExample.java @@ -1,4 +1,4 @@ -package main.java.com.javaedge.concurrency.concurrent; +package com.javaedge.concurrency.example.concurrent; import com.javaedge.concurrency.annoations.ThreadSafe; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/com/javaedge/concurrency/count/CountExample1.java b/concurrency/src/main/java/com/javaedge/concurrency/example/count/CountExample1.java similarity index 91% rename from src/main/java/com/javaedge/concurrency/count/CountExample1.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/count/CountExample1.java index d3f4817..7cfc0c1 100755 --- a/src/main/java/com/javaedge/concurrency/count/CountExample1.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/count/CountExample1.java @@ -1,6 +1,6 @@ -package main.java.com.javaedge.concurrency.count; +package com.javaedge.concurrency.example.count; -import main.java.com.javaedge.concurrency.annoations.NotThreadSafe; +import com.javaedge.concurrency.annoations.NotThreadSafe; import lombok.extern.slf4j.Slf4j; import java.util.concurrent.CountDownLatch; diff --git a/src/main/java/com/javaedge/concurrency/count/CountExample2.java b/concurrency/src/main/java/com/javaedge/concurrency/example/count/CountExample2.java similarity index 92% rename from src/main/java/com/javaedge/concurrency/count/CountExample2.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/count/CountExample2.java index 5499fa8..a386b11 100755 --- a/src/main/java/com/javaedge/concurrency/count/CountExample2.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/count/CountExample2.java @@ -1,6 +1,6 @@ -package main.java.com.javaedge.concurrency.count; +package com.javaedge.concurrency.example.count; -import main.java.com.javaedge.concurrency.annoations.ThreadSafe; +import com.javaedge.concurrency.annoations.ThreadSafe; import lombok.extern.slf4j.Slf4j; import java.util.concurrent.CountDownLatch; diff --git a/src/main/java/com/javaedge/concurrency/count/CountExample3.java b/concurrency/src/main/java/com/javaedge/concurrency/example/count/CountExample3.java similarity index 91% rename from src/main/java/com/javaedge/concurrency/count/CountExample3.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/count/CountExample3.java index 402cbdb..5a63a03 100755 --- a/src/main/java/com/javaedge/concurrency/count/CountExample3.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/count/CountExample3.java @@ -1,6 +1,6 @@ -package main.java.com.javaedge.concurrency.count; +package com.javaedge.concurrency.example.count; -import main.java.com.javaedge.concurrency.annoations.ThreadSafe; +import com.javaedge.concurrency.annoations.ThreadSafe; import lombok.extern.slf4j.Slf4j; import java.util.concurrent.CountDownLatch; diff --git a/src/main/java/com/javaedge/concurrency/count/CountExample4.java b/concurrency/src/main/java/com/javaedge/concurrency/example/count/CountExample4.java similarity index 91% rename from src/main/java/com/javaedge/concurrency/count/CountExample4.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/count/CountExample4.java index a3b87ae..0d961f0 100755 --- a/src/main/java/com/javaedge/concurrency/count/CountExample4.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/count/CountExample4.java @@ -1,6 +1,6 @@ -package main.java.com.javaedge.concurrency.count; +package com.javaedge.concurrency.example.count; -import main.java.com.javaedge.concurrency.annoations.NotThreadSafe; +import com.javaedge.concurrency.annoations.NotThreadSafe; import lombok.extern.slf4j.Slf4j; import java.util.concurrent.CountDownLatch; diff --git a/src/main/java/com/javaedge/concurrency/deadLock/DeadLock.java b/concurrency/src/main/java/com/javaedge/concurrency/example/deadLock/DeadLock.java similarity index 72% rename from src/main/java/com/javaedge/concurrency/deadLock/DeadLock.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/deadLock/DeadLock.java index 0719f17..304ce17 100755 --- a/src/main/java/com/javaedge/concurrency/deadLock/DeadLock.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/deadLock/DeadLock.java @@ -1,4 +1,4 @@ -package main.java.com.javaedge.concurrency.deadLock; +package com.javaedge.concurrency.example.deadLock; import lombok.extern.slf4j.Slf4j; @@ -9,46 +9,37 @@ * td1睡眠结束后需要锁定o2才能继续执行,而此时o2已被td2锁定; * td2睡眠结束后需要锁定o1才能继续执行,而此时o1已被td1锁定; * td1、td2相互等待,都需要得到对方锁定的资源才能继续执行,从而死锁。 - * - * @author JavaEdge */ + @Slf4j public class DeadLock implements Runnable { - public int flag = 1; - - /** - * 静态对象是类的所有对象共享的 - */ - private static final Object O_1 = new Object(); - private static final Object O_2 = new Object(); + //静态对象是类的所有对象共享的 + private static Object o1 = new Object(), o2 = new Object(); @Override public void run() { - log.info("flag:{}", flag); - if (flag == 1) { - synchronized (O_1) { + synchronized (o1) { try { Thread.sleep(500); } catch (Exception e) { e.printStackTrace(); } - synchronized (O_2) { + synchronized (o2) { log.info("1"); } } } - if (flag == 0) { - synchronized (O_2) { + synchronized (o2) { try { Thread.sleep(500); } catch (Exception e) { e.printStackTrace(); } - synchronized (O_1) { + synchronized (o1) { log.info("0"); } } @@ -60,8 +51,8 @@ public static void main(String[] args) { DeadLock td2 = new DeadLock(); td1.flag = 1; td2.flag = 0; - // td1,td2都处于可执行状态,但JVM线程调度先执行哪个线程是不确定的 - // td2的run()可能在td1的run()之前运行 + //td1,td2都处于可执行状态,但JVM线程调度先执行哪个线程是不确定的。 + //td2的run()可能在td1的run()之前运行 new Thread(td1).start(); new Thread(td2).start(); } diff --git a/src/main/java/com/javaedge/concurrency/immutable/ImmutableExample1.java b/concurrency/src/main/java/com/javaedge/concurrency/example/immutable/ImmutableExample1.java similarity index 84% rename from src/main/java/com/javaedge/concurrency/immutable/ImmutableExample1.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/immutable/ImmutableExample1.java index 8d83363..5797992 100755 --- a/src/main/java/com/javaedge/concurrency/immutable/ImmutableExample1.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/immutable/ImmutableExample1.java @@ -1,7 +1,7 @@ -package main.java.com.javaedge.concurrency.immutable; +package com.javaedge.concurrency.example.immutable; import com.google.common.collect.Maps; -import main.java.com.javaedge.concurrency.annoations.NotThreadSafe; +import com.javaedge.concurrency.annoations.NotThreadSafe; import lombok.extern.slf4j.Slf4j; import java.util.Map; diff --git a/src/main/java/com/javaedge/concurrency/immutable/ImmutableExample2.java b/concurrency/src/main/java/com/javaedge/concurrency/example/immutable/ImmutableExample2.java similarity index 74% rename from src/main/java/com/javaedge/concurrency/immutable/ImmutableExample2.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/immutable/ImmutableExample2.java index 5ac8089..eeaf7e1 100755 --- a/src/main/java/com/javaedge/concurrency/immutable/ImmutableExample2.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/immutable/ImmutableExample2.java @@ -1,10 +1,9 @@ -package main.java.com.javaedge.concurrency.immutable; +package com.javaedge.concurrency.example.immutable; import com.google.common.collect.Maps; -import main.java.com.javaedge.concurrency.annoations.ThreadSafe; +import com.javaedge.concurrency.annoations.ThreadSafe; import lombok.extern.slf4j.Slf4j; - import java.util.Collections; import java.util.Map; @@ -23,7 +22,7 @@ public class ImmutableExample2 { public static void main(String[] args) { map.put(1, 3); -// log.info("{}", map.get(1)); + log.info("{}", map.get(1)); } } diff --git a/src/main/java/com/javaedge/concurrency/immutable/ImmutableExample3.java b/concurrency/src/main/java/com/javaedge/concurrency/example/immutable/ImmutableExample3.java similarity index 85% rename from src/main/java/com/javaedge/concurrency/immutable/ImmutableExample3.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/immutable/ImmutableExample3.java index 9c88b70..587cd2d 100755 --- a/src/main/java/com/javaedge/concurrency/immutable/ImmutableExample3.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/immutable/ImmutableExample3.java @@ -1,9 +1,9 @@ -package main.java.com.javaedge.concurrency.immutable; +package com.javaedge.concurrency.example.immutable; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; -import main.java.com.javaedge.concurrency.annoations.ThreadSafe; +import com.javaedge.concurrency.annoations.ThreadSafe; @ThreadSafe public class ImmutableExample3 { diff --git a/src/main/java/com/javaedge/concurrency/lock/LockDemo.java b/concurrency/src/main/java/com/javaedge/concurrency/example/lock/LockDemo.java similarity index 92% rename from src/main/java/com/javaedge/concurrency/lock/LockDemo.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/lock/LockDemo.java index c7ae504..eb9f657 100644 --- a/src/main/java/com/javaedge/concurrency/lock/LockDemo.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/lock/LockDemo.java @@ -1,4 +1,4 @@ -package main.java.com.javaedge.concurrency.lock; +package com.javaedge.concurrency.example.lock; /** * 多线程 原子性 diff --git a/src/main/java/com/javaedge/concurrency/lock/LockExample1.java b/concurrency/src/main/java/com/javaedge/concurrency/example/lock/LockExample1.java similarity index 92% rename from src/main/java/com/javaedge/concurrency/lock/LockExample1.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/lock/LockExample1.java index 04994ee..8cd84b0 100755 --- a/src/main/java/com/javaedge/concurrency/lock/LockExample1.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/lock/LockExample1.java @@ -1,6 +1,6 @@ -package main.java.com.javaedge.concurrency.lock; +package com.javaedge.concurrency.example.lock; -import main.java.com.javaedge.concurrency.annoations.ThreadSafe; +import com.javaedge.concurrency.annoations.ThreadSafe; import lombok.extern.slf4j.Slf4j; import java.util.concurrent.CountDownLatch; diff --git a/src/main/java/com/javaedge/concurrency/lock/LockExample2.java b/concurrency/src/main/java/com/javaedge/concurrency/example/lock/LockExample2.java similarity index 93% rename from src/main/java/com/javaedge/concurrency/lock/LockExample2.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/lock/LockExample2.java index af76c79..ae631bb 100755 --- a/src/main/java/com/javaedge/concurrency/lock/LockExample2.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/lock/LockExample2.java @@ -1,6 +1,6 @@ -package main.java.com.javaedge.concurrency.lock; +package com.javaedge.concurrency.example.lock; -import main.java.com.javaedge.concurrency.annoations.ThreadSafe; +import com.javaedge.concurrency.annoations.ThreadSafe; import lombok.extern.slf4j.Slf4j; import java.util.concurrent.CountDownLatch; diff --git a/src/main/java/com/javaedge/concurrency/lock/LockExample3.java b/concurrency/src/main/java/com/javaedge/concurrency/example/lock/LockExample3.java similarity index 95% rename from src/main/java/com/javaedge/concurrency/lock/LockExample3.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/lock/LockExample3.java index 6afe438..d6c0be0 100755 --- a/src/main/java/com/javaedge/concurrency/lock/LockExample3.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/lock/LockExample3.java @@ -1,4 +1,4 @@ -package main.java.com.javaedge.concurrency.lock; +package com.javaedge.concurrency.example.lock; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/com/javaedge/concurrency/lock/LockExample4.java b/concurrency/src/main/java/com/javaedge/concurrency/example/lock/LockExample4.java similarity index 97% rename from src/main/java/com/javaedge/concurrency/lock/LockExample4.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/lock/LockExample4.java index b43892f..b775e55 100755 --- a/src/main/java/com/javaedge/concurrency/lock/LockExample4.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/lock/LockExample4.java @@ -1,4 +1,4 @@ -package main.java.com.javaedge.concurrency.lock; +package com.javaedge.concurrency.example.lock; import java.util.concurrent.locks.StampedLock; diff --git a/src/main/java/com/javaedge/concurrency/lock/LockExample5.java b/concurrency/src/main/java/com/javaedge/concurrency/example/lock/LockExample5.java similarity index 79% rename from src/main/java/com/javaedge/concurrency/lock/LockExample5.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/lock/LockExample5.java index 201bc89..cbb9e12 100755 --- a/src/main/java/com/javaedge/concurrency/lock/LockExample5.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/lock/LockExample5.java @@ -1,6 +1,6 @@ -package main.java.com.javaedge.concurrency.lock; +package com.javaedge.concurrency.example.lock; -import main.java.com.javaedge.concurrency.annoations.ThreadSafe; +import com.javaedge.concurrency.annoations.ThreadSafe; import lombok.extern.slf4j.Slf4j; import java.util.concurrent.CountDownLatch; @@ -9,9 +9,6 @@ import java.util.concurrent.Semaphore; import java.util.concurrent.locks.StampedLock; -/** - * @author JavaEdge - */ @Slf4j @ThreadSafe public class LockExample5 { @@ -24,13 +21,13 @@ public class LockExample5 { public static int count = 0; - private final static StampedLock STAMPED_LOCK = new StampedLock(); + private final static StampedLock lock = new StampedLock(); public static void main(String[] args) throws Exception { ExecutorService executorService = Executors.newCachedThreadPool(); final Semaphore semaphore = new Semaphore(threadTotal); final CountDownLatch countDownLatch = new CountDownLatch(clientTotal); - for (int i = 0; i < clientTotal; i++) { + for (int i = 0; i < clientTotal ; i++) { executorService.execute(() -> { try { semaphore.acquire(); @@ -48,11 +45,11 @@ public static void main(String[] args) throws Exception { } private static void add() { - long stamp = STAMPED_LOCK.writeLock(); + long stamp = lock.writeLock(); try { count++; } finally { - STAMPED_LOCK.unlock(stamp); + lock.unlock(stamp); } } } diff --git a/src/main/java/com/javaedge/concurrency/lock/LockExample6.java b/concurrency/src/main/java/com/javaedge/concurrency/example/lock/LockExample6.java similarity index 93% rename from src/main/java/com/javaedge/concurrency/lock/LockExample6.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/lock/LockExample6.java index 7afb645..94fae7b 100755 --- a/src/main/java/com/javaedge/concurrency/lock/LockExample6.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/lock/LockExample6.java @@ -1,13 +1,10 @@ -package main.java.com.javaedge.concurrency.lock; +package com.javaedge.concurrency.example.lock; import lombok.extern.slf4j.Slf4j; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantLock; -/** - * @author JavaEdge - */ @Slf4j public class LockExample6 { diff --git a/src/main/java/com/javaedge/concurrency/mq/Message.java b/concurrency/src/main/java/com/javaedge/concurrency/example/mq/Message.java similarity index 57% rename from src/main/java/com/javaedge/concurrency/mq/Message.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/mq/Message.java index f38d170..9e008a6 100644 --- a/src/main/java/com/javaedge/concurrency/mq/Message.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/mq/Message.java @@ -1,6 +1,9 @@ -package main.java.com.javaedge.concurrency.mq; +package com.javaedge.concurrency.example.mq; +import lombok.AllArgsConstructor; import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.extern.slf4j.Slf4j; import java.util.Date; diff --git a/src/main/java/com/javaedge/concurrency/mq/MqController.java b/concurrency/src/main/java/com/javaedge/concurrency/example/mq/MqController.java similarity index 80% rename from src/main/java/com/javaedge/concurrency/mq/MqController.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/mq/MqController.java index 0d53cf4..46d8abe 100644 --- a/src/main/java/com/javaedge/concurrency/mq/MqController.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/mq/MqController.java @@ -1,7 +1,7 @@ -package main.java.com.javaedge.concurrency.mq; +package com.javaedge.concurrency.example.mq; -import com.javaedge.concurrency.mq.kafka.KafkaSender; -import com.javaedge.concurrency.mq.rabbitmq.RabbitMqClient; +import com.javaedge.concurrency.example.mq.kafka.KafkaSender; +import com.javaedge.concurrency.example.mq.rabbitmq.RabbitMqClient; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; diff --git a/src/main/java/com/javaedge/concurrency/mq/kafka/KafkaReceiver.java b/concurrency/src/main/java/com/javaedge/concurrency/example/mq/kafka/KafkaReceiver.java similarity index 89% rename from src/main/java/com/javaedge/concurrency/mq/kafka/KafkaReceiver.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/mq/kafka/KafkaReceiver.java index bf384b7..14544cd 100644 --- a/src/main/java/com/javaedge/concurrency/mq/kafka/KafkaReceiver.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/mq/kafka/KafkaReceiver.java @@ -1,4 +1,4 @@ -package main.java.com.javaedge.concurrency.mq.kafka; +package com.javaedge.concurrency.example.mq.kafka; import lombok.extern.slf4j.Slf4j; import org.apache.kafka.clients.consumer.ConsumerRecord; diff --git a/src/main/java/com/javaedge/concurrency/mq/kafka/KafkaSender.java b/concurrency/src/main/java/com/javaedge/concurrency/example/mq/kafka/KafkaSender.java similarity index 87% rename from src/main/java/com/javaedge/concurrency/mq/kafka/KafkaSender.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/mq/kafka/KafkaSender.java index ea6c3c8..927a7f1 100644 --- a/src/main/java/com/javaedge/concurrency/mq/kafka/KafkaSender.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/mq/kafka/KafkaSender.java @@ -1,8 +1,8 @@ -package main.java.com.javaedge.concurrency.mq.kafka; +package com.javaedge.concurrency.example.mq.kafka; import com.google.gson.Gson; import com.google.gson.GsonBuilder; -import main.java.com.javaedge.concurrency.mq.Message; +import com.javaedge.concurrency.example.mq.Message; import lombok.extern.slf4j.Slf4j; import org.springframework.kafka.core.KafkaTemplate; diff --git a/src/main/java/com/javaedge/concurrency/mq/kafka/TopicConstants.java b/concurrency/src/main/java/com/javaedge/concurrency/example/mq/kafka/TopicConstants.java similarity index 73% rename from src/main/java/com/javaedge/concurrency/mq/kafka/TopicConstants.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/mq/kafka/TopicConstants.java index 07255d6..137fe91 100644 --- a/src/main/java/com/javaedge/concurrency/mq/kafka/TopicConstants.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/mq/kafka/TopicConstants.java @@ -1,4 +1,4 @@ -package main.java.com.javaedge.concurrency.mq.kafka; +package com.javaedge.concurrency.example.mq.kafka; /** * @author JavaEdge diff --git a/src/main/java/com/javaedge/concurrency/mq/rabbitmq/QueueConstants.java b/concurrency/src/main/java/com/javaedge/concurrency/example/mq/rabbitmq/QueueConstants.java similarity index 72% rename from src/main/java/com/javaedge/concurrency/mq/rabbitmq/QueueConstants.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/mq/rabbitmq/QueueConstants.java index 9c43a3a..4bc59cf 100644 --- a/src/main/java/com/javaedge/concurrency/mq/rabbitmq/QueueConstants.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/mq/rabbitmq/QueueConstants.java @@ -1,4 +1,4 @@ -package main.java.com.javaedge.concurrency.mq.rabbitmq; +package com.javaedge.concurrency.example.mq.rabbitmq; /** * @author JavaEdge diff --git a/src/main/java/com/javaedge/concurrency/mq/rabbitmq/RabbitMqClient.java b/concurrency/src/main/java/com/javaedge/concurrency/example/mq/rabbitmq/RabbitMqClient.java similarity index 89% rename from src/main/java/com/javaedge/concurrency/mq/rabbitmq/RabbitMqClient.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/mq/rabbitmq/RabbitMqClient.java index daef199..b14c6bc 100644 --- a/src/main/java/com/javaedge/concurrency/mq/rabbitmq/RabbitMqClient.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/mq/rabbitmq/RabbitMqClient.java @@ -1,4 +1,4 @@ -package main.java.com.javaedge.concurrency.mq.rabbitmq; +package com.javaedge.concurrency.example.mq.rabbitmq; import lombok.extern.slf4j.Slf4j; import org.springframework.amqp.rabbit.core.RabbitTemplate; diff --git a/src/main/java/com/javaedge/concurrency/mq/rabbitmq/RabbitMqConfig.java b/concurrency/src/main/java/com/javaedge/concurrency/example/mq/rabbitmq/RabbitMqConfig.java similarity index 86% rename from src/main/java/com/javaedge/concurrency/mq/rabbitmq/RabbitMqConfig.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/mq/rabbitmq/RabbitMqConfig.java index b239e62..e983afc 100644 --- a/src/main/java/com/javaedge/concurrency/mq/rabbitmq/RabbitMqConfig.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/mq/rabbitmq/RabbitMqConfig.java @@ -1,4 +1,4 @@ -package main.java.com.javaedge.concurrency.mq.rabbitmq; +package com.javaedge.concurrency.example.mq.rabbitmq; import org.springframework.amqp.core.Queue; import org.springframework.context.annotation.Bean; diff --git a/src/main/java/com/javaedge/concurrency/mq/rabbitmq/RabbitMqServer.java b/concurrency/src/main/java/com/javaedge/concurrency/example/mq/rabbitmq/RabbitMqServer.java similarity index 87% rename from src/main/java/com/javaedge/concurrency/mq/rabbitmq/RabbitMqServer.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/mq/rabbitmq/RabbitMqServer.java index aaba62f..2e90678 100644 --- a/src/main/java/com/javaedge/concurrency/mq/rabbitmq/RabbitMqServer.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/mq/rabbitmq/RabbitMqServer.java @@ -1,4 +1,4 @@ -package main.java.com.javaedge.concurrency.mq.rabbitmq; +package com.javaedge.concurrency.example.mq.rabbitmq; import lombok.extern.slf4j.Slf4j; import org.springframework.amqp.rabbit.annotation.RabbitListener; diff --git a/concurrency/src/main/java/com/javaedge/concurrency/example/package-info.java b/concurrency/src/main/java/com/javaedge/concurrency/example/package-info.java new file mode 100755 index 0000000..c90d4ba --- /dev/null +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/package-info.java @@ -0,0 +1 @@ +package com.javaedge.concurrency.example; \ No newline at end of file diff --git a/src/main/java/com/javaedge/concurrency/publish/Escape.java b/concurrency/src/main/java/com/javaedge/concurrency/example/publish/Escape.java similarity index 68% rename from src/main/java/com/javaedge/concurrency/publish/Escape.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/publish/Escape.java index 27958cc..7dec55b 100755 --- a/src/main/java/com/javaedge/concurrency/publish/Escape.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/publish/Escape.java @@ -1,7 +1,7 @@ -package main.java.com.javaedge.concurrency.publish; +package com.javaedge.concurrency.example.publish; -import main.java.com.javaedge.concurrency.annoations.NotRecommend; -import main.java.com.javaedge.concurrency.annoations.NotThreadSafe; +import com.javaedge.concurrency.annoations.NotRecommend; +import com.javaedge.concurrency.annoations.NotThreadSafe; import lombok.extern.slf4j.Slf4j; @Slf4j diff --git a/src/main/java/com/javaedge/concurrency/publish/UnsafePublish.java b/concurrency/src/main/java/com/javaedge/concurrency/example/publish/UnsafePublish.java similarity index 81% rename from src/main/java/com/javaedge/concurrency/publish/UnsafePublish.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/publish/UnsafePublish.java index 25cc4fe..6c9522d 100755 --- a/src/main/java/com/javaedge/concurrency/publish/UnsafePublish.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/publish/UnsafePublish.java @@ -1,6 +1,6 @@ -package main.java.com.javaedge.concurrency.publish; +package com.javaedge.concurrency.example.publish; -import main.java.com.javaedge.concurrency.annoations.NotThreadSafe; +import com.javaedge.concurrency.annoations.NotThreadSafe; import lombok.extern.slf4j.Slf4j; import java.util.Arrays; diff --git a/src/main/java/com/javaedge/concurrency/singleton/SingletonExample1.java b/concurrency/src/main/java/com/javaedge/concurrency/example/singleton/SingletonExample1.java similarity index 79% rename from src/main/java/com/javaedge/concurrency/singleton/SingletonExample1.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/singleton/SingletonExample1.java index 0a3de11..c4c3954 100755 --- a/src/main/java/com/javaedge/concurrency/singleton/SingletonExample1.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/singleton/SingletonExample1.java @@ -1,6 +1,6 @@ -package main.java.com.javaedge.concurrency.singleton; +package com.javaedge.concurrency.example.singleton; -import main.java.com.javaedge.concurrency.annoations.NotThreadSafe; +import com.javaedge.concurrency.annoations.NotThreadSafe; /** * 懒汉模式 diff --git a/src/main/java/com/javaedge/concurrency/singleton/SingletonExample2.java b/concurrency/src/main/java/com/javaedge/concurrency/example/singleton/SingletonExample2.java similarity index 76% rename from src/main/java/com/javaedge/concurrency/singleton/SingletonExample2.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/singleton/SingletonExample2.java index 79ac587..e19499c 100755 --- a/src/main/java/com/javaedge/concurrency/singleton/SingletonExample2.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/singleton/SingletonExample2.java @@ -1,6 +1,6 @@ -package main.java.com.javaedge.concurrency.singleton; +package com.javaedge.concurrency.example.singleton; -import main.java.com.javaedge.concurrency.annoations.ThreadSafe; +import com.javaedge.concurrency.annoations.ThreadSafe; /** * 饿汉模式 diff --git a/src/main/java/com/javaedge/concurrency/singleton/SingletonExample3.java b/concurrency/src/main/java/com/javaedge/concurrency/example/singleton/SingletonExample3.java similarity index 72% rename from src/main/java/com/javaedge/concurrency/singleton/SingletonExample3.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/singleton/SingletonExample3.java index 0290a10..e0ca068 100755 --- a/src/main/java/com/javaedge/concurrency/singleton/SingletonExample3.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/singleton/SingletonExample3.java @@ -1,7 +1,7 @@ -package main.java.com.javaedge.concurrency.singleton; +package com.javaedge.concurrency.example.singleton; -import main.java.com.javaedge.concurrency.annoations.NotRecommend; -import main.java.com.javaedge.concurrency.annoations.ThreadSafe; +import com.javaedge.concurrency.annoations.NotRecommend; +import com.javaedge.concurrency.annoations.ThreadSafe; /** * 懒汉模式 diff --git a/src/main/java/com/javaedge/concurrency/singleton/SingletonExample4.java b/concurrency/src/main/java/com/javaedge/concurrency/example/singleton/SingletonExample4.java similarity index 89% rename from src/main/java/com/javaedge/concurrency/singleton/SingletonExample4.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/singleton/SingletonExample4.java index 08414f6..611278d 100755 --- a/src/main/java/com/javaedge/concurrency/singleton/SingletonExample4.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/singleton/SingletonExample4.java @@ -1,6 +1,6 @@ -package main.java.com.javaedge.concurrency.singleton; +package com.javaedge.concurrency.example.singleton; -import main.java.com.javaedge.concurrency.annoations.NotThreadSafe; +import com.javaedge.concurrency.annoations.NotThreadSafe; /** * 懒汉模式 -》 双重同步锁单例模式 diff --git a/src/main/java/com/javaedge/concurrency/singleton/SingletonExample5.java b/concurrency/src/main/java/com/javaedge/concurrency/example/singleton/SingletonExample5.java similarity index 88% rename from src/main/java/com/javaedge/concurrency/singleton/SingletonExample5.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/singleton/SingletonExample5.java index ac34369..f4c6dfd 100755 --- a/src/main/java/com/javaedge/concurrency/singleton/SingletonExample5.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/singleton/SingletonExample5.java @@ -1,6 +1,6 @@ -package main.java.com.javaedge.concurrency.singleton; +package com.javaedge.concurrency.example.singleton; -import main.java.com.javaedge.concurrency.annoations.ThreadSafe; +import com.javaedge.concurrency.annoations.ThreadSafe; /** * 懒汉模式 -》 双重同步锁单例模式 diff --git a/src/main/java/com/javaedge/concurrency/singleton/SingletonExample6.java b/concurrency/src/main/java/com/javaedge/concurrency/example/singleton/SingletonExample6.java similarity index 83% rename from src/main/java/com/javaedge/concurrency/singleton/SingletonExample6.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/singleton/SingletonExample6.java index 8313698..8d02e5e 100755 --- a/src/main/java/com/javaedge/concurrency/singleton/SingletonExample6.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/singleton/SingletonExample6.java @@ -1,6 +1,6 @@ -package main.java.com.javaedge.concurrency.singleton; +package com.javaedge.concurrency.example.singleton; -import main.java.com.javaedge.concurrency.annoations.ThreadSafe; +import com.javaedge.concurrency.annoations.ThreadSafe; /** * 饿汉模式 diff --git a/src/main/java/com/javaedge/concurrency/singleton/SingletonExample7.java b/concurrency/src/main/java/com/javaedge/concurrency/example/singleton/SingletonExample7.java similarity index 76% rename from src/main/java/com/javaedge/concurrency/singleton/SingletonExample7.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/singleton/SingletonExample7.java index ffb6edb..4475432 100755 --- a/src/main/java/com/javaedge/concurrency/singleton/SingletonExample7.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/singleton/SingletonExample7.java @@ -1,7 +1,7 @@ -package main.java.com.javaedge.concurrency.singleton; +package com.javaedge.concurrency.example.singleton; -import main.java.com.javaedge.concurrency.annoations.Recommend; -import main.java.com.javaedge.concurrency.annoations.ThreadSafe; +import com.javaedge.concurrency.annoations.Recommend; +import com.javaedge.concurrency.annoations.ThreadSafe; /** * 枚举模式:最安全 diff --git a/src/main/java/com/javaedge/concurrency/sync/SynchronizedExample1.java b/concurrency/src/main/java/com/javaedge/concurrency/example/sync/SynchronizedExample1.java similarity index 68% rename from src/main/java/com/javaedge/concurrency/sync/SynchronizedExample1.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/sync/SynchronizedExample1.java index e1fea73..a5335c5 100755 --- a/src/main/java/com/javaedge/concurrency/sync/SynchronizedExample1.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/sync/SynchronizedExample1.java @@ -1,23 +1,14 @@ -package main.java.com.javaedge.concurrency.sync; +package com.javaedge.concurrency.example.sync; import lombok.extern.slf4j.Slf4j; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; -/** - * - * @author JavaEdge - * @date 2019/10/20 - */ @Slf4j public class SynchronizedExample1 { - /** - * 修饰一个代码块 - * - * @param j - */ + // 修饰一个代码块 public void test1(int j) { synchronized (this) { for (int i = 0; i < 10; i++) { @@ -26,11 +17,7 @@ public void test1(int j) { } } - /** - * 修饰一个方法 - * - * @param j - */ + // 修饰一个方法 public synchronized void test2(int j) { for (int i = 0; i < 10; i++) { log.info("test2 {} - {}", j, i); @@ -41,7 +28,11 @@ public static void main(String[] args) { SynchronizedExample1 example1 = new SynchronizedExample1(); SynchronizedExample1 example2 = new SynchronizedExample1(); ExecutorService executorService = Executors.newCachedThreadPool(); - executorService.execute(() -> example1.test2(1)); - executorService.execute(() -> example2.test2(2)); + executorService.execute(() -> { + example1.test2(1); + }); + executorService.execute(() -> { + example2.test2(2); + }); } } diff --git a/src/main/java/com/javaedge/concurrency/sync/SynchronizedExample2.java b/concurrency/src/main/java/com/javaedge/concurrency/example/sync/SynchronizedExample2.java similarity index 79% rename from src/main/java/com/javaedge/concurrency/sync/SynchronizedExample2.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/sync/SynchronizedExample2.java index 936a33c..36f74a9 100755 --- a/src/main/java/com/javaedge/concurrency/sync/SynchronizedExample2.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/sync/SynchronizedExample2.java @@ -1,16 +1,10 @@ -package main.java.com.javaedge.concurrency.sync; +package com.javaedge.concurrency.example.sync; import lombok.extern.slf4j.Slf4j; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; - -/** - * - * @author JavaEdge - * @date 2019/10/20 - */ @Slf4j public class SynchronizedExample2 { @@ -34,7 +28,11 @@ public static void main(String[] args) { SynchronizedExample2 example1 = new SynchronizedExample2(); SynchronizedExample2 example2 = new SynchronizedExample2(); ExecutorService executorService = Executors.newCachedThreadPool(); - executorService.execute(() -> example1.test1(1)); - executorService.execute(() -> example2.test1(2)); + executorService.execute(() -> { + example1.test1(1); + }); + executorService.execute(() -> { + example2.test1(2); + }); } } diff --git a/src/main/java/com/javaedge/concurrency/syncContainer/CollectionsExample1.java b/concurrency/src/main/java/com/javaedge/concurrency/example/syncContainer/CollectionsExample1.java similarity index 96% rename from src/main/java/com/javaedge/concurrency/syncContainer/CollectionsExample1.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/syncContainer/CollectionsExample1.java index c118ff9..81acbb9 100755 --- a/src/main/java/com/javaedge/concurrency/syncContainer/CollectionsExample1.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/syncContainer/CollectionsExample1.java @@ -1,4 +1,4 @@ -package main.java.com.javaedge.concurrency.syncContainer; +package com.javaedge.concurrency.example.syncContainer; import com.google.common.collect.Lists; import com.javaedge.concurrency.annoations.ThreadSafe; diff --git a/src/main/java/com/javaedge/concurrency/syncContainer/CollectionsExample2.java b/concurrency/src/main/java/com/javaedge/concurrency/example/syncContainer/CollectionsExample2.java similarity index 96% rename from src/main/java/com/javaedge/concurrency/syncContainer/CollectionsExample2.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/syncContainer/CollectionsExample2.java index a60e053..951cfbb 100755 --- a/src/main/java/com/javaedge/concurrency/syncContainer/CollectionsExample2.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/syncContainer/CollectionsExample2.java @@ -1,4 +1,4 @@ -package main.java.com.javaedge.concurrency.syncContainer; +package com.javaedge.concurrency.example.syncContainer; import com.google.common.collect.Sets; import com.javaedge.concurrency.annoations.ThreadSafe; diff --git a/src/main/java/com/javaedge/concurrency/syncContainer/CollectionsExample3.java b/concurrency/src/main/java/com/javaedge/concurrency/example/syncContainer/CollectionsExample3.java similarity index 96% rename from src/main/java/com/javaedge/concurrency/syncContainer/CollectionsExample3.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/syncContainer/CollectionsExample3.java index 32ec833..e4a7bce 100755 --- a/src/main/java/com/javaedge/concurrency/syncContainer/CollectionsExample3.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/syncContainer/CollectionsExample3.java @@ -1,4 +1,4 @@ -package main.java.com.javaedge.concurrency.syncContainer; +package com.javaedge.concurrency.example.syncContainer; import com.javaedge.concurrency.annoations.ThreadSafe; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/com/javaedge/concurrency/syncContainer/HashTableExample.java b/concurrency/src/main/java/com/javaedge/concurrency/example/syncContainer/HashTableExample.java similarity index 96% rename from src/main/java/com/javaedge/concurrency/syncContainer/HashTableExample.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/syncContainer/HashTableExample.java index 9bdcba0..fa11482 100755 --- a/src/main/java/com/javaedge/concurrency/syncContainer/HashTableExample.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/syncContainer/HashTableExample.java @@ -1,4 +1,4 @@ -package main.java.com.javaedge.concurrency.syncContainer; +package com.javaedge.concurrency.example.syncContainer; import com.javaedge.concurrency.annoations.ThreadSafe; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/com/javaedge/concurrency/syncContainer/VectorExample1.java b/concurrency/src/main/java/com/javaedge/concurrency/example/syncContainer/VectorExample1.java similarity index 96% rename from src/main/java/com/javaedge/concurrency/syncContainer/VectorExample1.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/syncContainer/VectorExample1.java index 90344c9..9a3251e 100755 --- a/src/main/java/com/javaedge/concurrency/syncContainer/VectorExample1.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/syncContainer/VectorExample1.java @@ -1,4 +1,4 @@ -package main.java.com.javaedge.concurrency.syncContainer; +package com.javaedge.concurrency.example.syncContainer; import com.javaedge.concurrency.annoations.ThreadSafe; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/com/javaedge/concurrency/syncContainer/VectorExample2.java b/concurrency/src/main/java/com/javaedge/concurrency/example/syncContainer/VectorExample2.java similarity index 93% rename from src/main/java/com/javaedge/concurrency/syncContainer/VectorExample2.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/syncContainer/VectorExample2.java index 0c6742e..80273bd 100755 --- a/src/main/java/com/javaedge/concurrency/syncContainer/VectorExample2.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/syncContainer/VectorExample2.java @@ -1,4 +1,4 @@ -package main.java.com.javaedge.concurrency.syncContainer; +package com.javaedge.concurrency.example.syncContainer; import com.javaedge.concurrency.annoations.NotThreadSafe; diff --git a/src/main/java/com/javaedge/concurrency/syncContainer/VectorExample3.java b/concurrency/src/main/java/com/javaedge/concurrency/example/syncContainer/VectorExample3.java similarity index 94% rename from src/main/java/com/javaedge/concurrency/syncContainer/VectorExample3.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/syncContainer/VectorExample3.java index f3994c4..427a7ef 100755 --- a/src/main/java/com/javaedge/concurrency/syncContainer/VectorExample3.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/syncContainer/VectorExample3.java @@ -1,4 +1,4 @@ -package main.java.com.javaedge.concurrency.syncContainer; +package com.javaedge.concurrency.example.syncContainer; import java.util.Iterator; import java.util.Vector; diff --git a/src/main/java/com/javaedge/concurrency/threadLocal/RequestHolder.java b/concurrency/src/main/java/com/javaedge/concurrency/example/threadLocal/RequestHolder.java similarity index 87% rename from src/main/java/com/javaedge/concurrency/threadLocal/RequestHolder.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/threadLocal/RequestHolder.java index 7066bda..5847b29 100755 --- a/src/main/java/com/javaedge/concurrency/threadLocal/RequestHolder.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/threadLocal/RequestHolder.java @@ -1,4 +1,4 @@ -package main.java.com.javaedge.concurrency.threadLocal; +package com.javaedge.concurrency.example.threadLocal; /** * diff --git a/src/main/java/com/javaedge/concurrency/threadLocal/ThreadLocalController.java b/concurrency/src/main/java/com/javaedge/concurrency/example/threadLocal/ThreadLocalController.java similarity index 88% rename from src/main/java/com/javaedge/concurrency/threadLocal/ThreadLocalController.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/threadLocal/ThreadLocalController.java index 7454d3c..031e5f2 100755 --- a/src/main/java/com/javaedge/concurrency/threadLocal/ThreadLocalController.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/threadLocal/ThreadLocalController.java @@ -1,4 +1,4 @@ -package main.java.com.javaedge.concurrency.threadLocal; +package com.javaedge.concurrency.example.threadLocal; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; diff --git a/src/main/java/com/javaedge/concurrency/threadpool/ThreadPoolExample1.java b/concurrency/src/main/java/com/javaedge/concurrency/example/threadpool/ThreadPoolExample1.java similarity index 90% rename from src/main/java/com/javaedge/concurrency/threadpool/ThreadPoolExample1.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/threadpool/ThreadPoolExample1.java index 1417146..20b963e 100755 --- a/src/main/java/com/javaedge/concurrency/threadpool/ThreadPoolExample1.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/threadpool/ThreadPoolExample1.java @@ -1,4 +1,4 @@ -package main.java.com.javaedge.concurrency.threadpool; +package com.javaedge.concurrency.example.threadpool; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/com/javaedge/concurrency/threadpool/ThreadPoolExample2.java b/concurrency/src/main/java/com/javaedge/concurrency/example/threadpool/ThreadPoolExample2.java similarity index 90% rename from src/main/java/com/javaedge/concurrency/threadpool/ThreadPoolExample2.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/threadpool/ThreadPoolExample2.java index 9cd3809..5191771 100755 --- a/src/main/java/com/javaedge/concurrency/threadpool/ThreadPoolExample2.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/threadpool/ThreadPoolExample2.java @@ -1,4 +1,4 @@ -package main.java.com.javaedge.concurrency.threadpool; +package com.javaedge.concurrency.example.threadpool; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/com/javaedge/concurrency/threadpool/ThreadPoolExample3.java b/concurrency/src/main/java/com/javaedge/concurrency/example/threadpool/ThreadPoolExample3.java similarity index 90% rename from src/main/java/com/javaedge/concurrency/threadpool/ThreadPoolExample3.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/threadpool/ThreadPoolExample3.java index 7930097..255d290 100755 --- a/src/main/java/com/javaedge/concurrency/threadpool/ThreadPoolExample3.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/threadpool/ThreadPoolExample3.java @@ -1,4 +1,4 @@ -package main.java.com.javaedge.concurrency.threadpool; +package com.javaedge.concurrency.example.threadpool; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/com/javaedge/concurrency/threadpool/ThreadPoolExample4.java b/concurrency/src/main/java/com/javaedge/concurrency/example/threadpool/ThreadPoolExample4.java similarity index 94% rename from src/main/java/com/javaedge/concurrency/threadpool/ThreadPoolExample4.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/threadpool/ThreadPoolExample4.java index d9fb5e9..869b627 100755 --- a/src/main/java/com/javaedge/concurrency/threadpool/ThreadPoolExample4.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/threadpool/ThreadPoolExample4.java @@ -1,4 +1,4 @@ -package main.java.com.javaedge.concurrency.threadpool; +package com.javaedge.concurrency.example.threadpool; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/com/javaedge/concurrency/threadpool/ThreadPoolExample5.java b/concurrency/src/main/java/com/javaedge/concurrency/example/threadpool/ThreadPoolExample5.java similarity index 96% rename from src/main/java/com/javaedge/concurrency/threadpool/ThreadPoolExample5.java rename to concurrency/src/main/java/com/javaedge/concurrency/example/threadpool/ThreadPoolExample5.java index a02ecc4..f9d3462 100644 --- a/src/main/java/com/javaedge/concurrency/threadpool/ThreadPoolExample5.java +++ b/concurrency/src/main/java/com/javaedge/concurrency/example/threadpool/ThreadPoolExample5.java @@ -1,4 +1,4 @@ -package main.java.com.javaedge.concurrency.threadpool; +package com.javaedge.concurrency.example.threadpool; import org.testng.annotations.Test; @@ -28,13 +28,16 @@ public void testCommon(ThreadPoolExecutor threadPoolExecutor) throws Exception { // 测试: 提交15个执行时间需要3秒的任务,看超过大小的2个,对应的处理情况 for (int i = 0; i < 15; i++) { int n = i; - threadPoolExecutor.submit(() -> { - try { - System.out.println("开始执行:" + n); - Thread.sleep(3000L); - System.err.println("执行结束:" + n); - } catch (InterruptedException e) { - e.printStackTrace(); + threadPoolExecutor.submit(new Runnable() { + @Override + public void run() { + try { + System.out.println("开始执行:" + n); + Thread.sleep(3000L); + System.err.println("执行结束:" + n); + } catch (InterruptedException e) { + e.printStackTrace(); + } } }); System.out.println("任务提交成功 :" + i); diff --git a/src/main/resources/application.properties b/concurrency/src/main/resources/application.properties similarity index 100% rename from src/main/resources/application.properties rename to concurrency/src/main/resources/application.properties diff --git a/src/test/com/javaedge/concurrency/ConcurrencyApplicationTests.java b/concurrency/src/test/java/com/javaedge/concurrency/ConcurrencyApplicationTests.java similarity index 68% rename from src/test/com/javaedge/concurrency/ConcurrencyApplicationTests.java rename to concurrency/src/test/java/com/javaedge/concurrency/ConcurrencyApplicationTests.java index 3928bea..ccd5c26 100755 --- a/src/test/com/javaedge/concurrency/ConcurrencyApplicationTests.java +++ b/concurrency/src/test/java/com/javaedge/concurrency/ConcurrencyApplicationTests.java @@ -1,4 +1,4 @@ -package test.com.javaedge.concurrency; +package com.javaedge.concurrency; import org.junit.Test; import org.junit.runner.RunWith; @@ -10,10 +10,7 @@ public class ConcurrencyApplicationTests { @Test - public void test() { - Thread thread = new Thread(); - thread.start(); - thread.start(); + public void contextLoads() { } } diff --git a/mvnw b/mvnw index df68171..5bf251c 100755 --- a/mvnw +++ b/mvnw @@ -55,7 +55,7 @@ case "`uname`" in MINGW*) mingw=true;; Darwin*) darwin=true # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home - # See https://developer.JavaEdge.com/library/mac/qa/qa1170/_index.html + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html if [ -z "$JAVA_HOME" ]; then if [ -x "/usr/libexec/java_home" ]; then export JAVA_HOME="`/usr/libexec/java_home`" diff --git a/pom.xml b/pom.xml index 19c29f6..ba5b550 100755 --- a/pom.xml +++ b/pom.xml @@ -3,9 +3,10 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - com.javaedge + com.mmall concurrency 0.0.1-SNAPSHOT + war concurrency Demo project for Spring Boot @@ -21,7 +22,6 @@ UTF-8 UTF-8 1.8 - com.javaedge.concurrency.ConcurrencyApplication @@ -37,6 +37,12 @@ test + + org.projectlombok + lombok + 1.18.4 + + com.google.guava guava @@ -89,20 +95,6 @@ compile - - org.projectlombok - lombok - - - junit - junit - - - - io.netty - netty-all - 4.1.15.Final - diff --git a/src/main/java/AppendixA/Main.java b/src/main/java/AppendixA/Main.java deleted file mode 100644 index ebfb1b9..0000000 --- a/src/main/java/AppendixA/Main.java +++ /dev/null @@ -1,9 +0,0 @@ -package main.java.AppendixA; - -public class Main { - public static void main(String[] args) { - System.out.println(Thread.currentThread().getName() + ":BEGIN"); - new MyFrame(); - System.out.println(Thread.currentThread().getName() + ":END"); - } -} diff --git a/src/main/java/AppendixA/MyFrame.java b/src/main/java/AppendixA/MyFrame.java deleted file mode 100644 index 7e8fa87..0000000 --- a/src/main/java/AppendixA/MyFrame.java +++ /dev/null @@ -1,63 +0,0 @@ -package main.java.AppendixA; - -import javax.swing.JFrame; -import javax.swing.JButton; -import javax.swing.JLabel; -import javax.swing.SwingUtilities; -import java.awt.FlowLayout; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; - - -public class MyFrame extends JFrame implements ActionListener { - private final JLabel label = new JLabel("Event Dispatching Thread Sample"); - private final JButton button = new JButton("countUp"); - public MyFrame() { - super("MyFrame"); - getContentPane().setLayout(new FlowLayout()); - getContentPane().add(label); - getContentPane().add(button); - button.addActionListener(this); - setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - pack(); - setVisible(true); - } - public void actionPerformed(ActionEvent e) { - if (e.getSource() == button) { - countUp(); - } - } - private void countUp() { - System.out.println(Thread.currentThread().getName() + ":countUp:BEGIN"); - - // invokerThread��ָ��ʱ����sleep֮�󣬵���SwingUtilities.invokeLater - new Thread("invokerThread") { - public void run() { - System.out.println(Thread.currentThread().getName() + ":invokerThread:BEGIN"); - for (int i = 0; i < 10; i++) { - final String string = "" + i; - try { - // executor�ᱻ��Event Dispatching Thread���� - final Runnable executor = new Runnable() { - public void run() { - System.out.println(Thread.currentThread().getName() + ":executor:BEGIN:string = " + string); - label.setText(string); - System.out.println(Thread.currentThread().getName() + ":executor:END"); - } - }; - - // ��Event Dispatching Thread���ó�exector - SwingUtilities.invokeLater(executor); - - Thread.sleep(1000); - } catch (Exception e) { - e.printStackTrace(); - } - } - System.out.println(Thread.currentThread().getName() + ":invokerThread:END"); - } - }.start(); - - System.out.println(Thread.currentThread().getName() + ":countUp:END"); - } -} diff --git a/src/main/java/Balking/Q5/TestThread.java b/src/main/java/Balking/Q5/TestThread.java deleted file mode 100644 index 2c4466f..0000000 --- a/src/main/java/Balking/Q5/TestThread.java +++ /dev/null @@ -1,15 +0,0 @@ -package main.java.Balking.Q5; - -public class TestThread extends Thread { - public void run() { - System.out.print("BEGIN"); - for (int i = 0; i < 50; i++) { - System.out.print("."); - try { - Thread.sleep(100); - } catch (InterruptedException e) { - } - } - System.out.println("END"); - } -} diff --git a/src/main/java/Balking/Sample/ChangerThread.java b/src/main/java/Balking/Sample/ChangerThread.java deleted file mode 100644 index e058762..0000000 --- a/src/main/java/Balking/Sample/ChangerThread.java +++ /dev/null @@ -1,26 +0,0 @@ -//package Balking.Sample; -// -//import java.io.IOException; -//import java.util.Random; -// -//public class ChangerThread extends Thread { -// private Data data; -// private Random random = new Random(); -// public ChangerThread(String name, Data data) { -// super(name); -// this.data = data; -// } -// public void run() { -// try { -// for (int i = 0; true; i++) { -// data.change("No." + i); //�޸����Ϯ� -// Thread.sleep(random.nextInt(1000)); // ģ��ȥ��������� -// data.save(); // ��ȷ��Ҫ��浵 -// } -// } catch (IOException e) { -// e.printStackTrace(); -// } catch (InterruptedException e) { -// e.printStackTrace(); -// } -// } -//} diff --git a/src/main/java/Immutable/A6_2/Main.java b/src/main/java/Immutable/A6_2/Main.java deleted file mode 100644 index 1f8fec5..0000000 --- a/src/main/java/Immutable/A6_2/Main.java +++ /dev/null @@ -1,31 +0,0 @@ -//package Immutable.A6_2; -// -//import person.MutablePerson; -//import person.ImmutablePerson; -// -//public class Main { -// public static void main(String[] args) { -// MutablePerson mutable = new MutablePerson("start", "start"); -// new CrackerThread(mutable).start(); -// new CrackerThread(mutable).start(); -// new CrackerThread(mutable).start(); -// for (int i = 0; true; i++) { -// mutable.setPerson("" + i, "" + i); -// } -// } -//} -// -//class CrackerThread extends Thread { -// private final MutablePerson mutable; -// public CrackerThread(MutablePerson mutable) { -// this.mutable = mutable; -// } -// public void run() { -// while (true) { -// ImmutablePerson immutable = new ImmutablePerson(mutable); -// if (!immutable.getName().equals(immutable.getAddress())) { -// System.out.println(currentThread().getName() + " ***** BROKEN ***** " + immutable); -// } -// } -// } -//} diff --git a/src/main/java/Immutable/Q2/Main.java b/src/main/java/Immutable/Q2/Main.java deleted file mode 100644 index 8216518..0000000 --- a/src/main/java/Immutable/Q2/Main.java +++ /dev/null @@ -1,8 +0,0 @@ -package main.java.Immutable.Q2; - -public class Main { - public static void main(String[] args) { - String s = "BAT"; - System.out.println(s.replace('B', 'C')); // 'B'ȡ����'C' - } -} diff --git a/src/main/java/com/javaedge/concurrency/LockSupportBlockerTest.java b/src/main/java/com/javaedge/concurrency/LockSupportBlockerTest.java deleted file mode 100644 index 7b9ae45..0000000 --- a/src/main/java/com/javaedge/concurrency/LockSupportBlockerTest.java +++ /dev/null @@ -1,30 +0,0 @@ -package main.java.com.javaedge.concurrency; - -import java.util.concurrent.TimeUnit; -import java.util.concurrent.locks.LockSupport; - -public class LockSupportBlockerTest { - public static void main(String[] args) { - Thread t3 = new Thread(() -> { - Thread.currentThread().setName("t3"); - System.out.println(Thread.currentThread().getName() + " park 5 seconds"); - //park 5 seconds, set blocker - Object blocker = new String("JavaEdge"); - LockSupport.parkUntil(blocker, System.currentTimeMillis() + TimeUnit.MILLISECONDS.convert(5, TimeUnit.SECONDS)); - System.out.println(Thread.currentThread().getName() + " after park"); - }); - t3.start(); - - try { - Object t3_blocker = null; - while (t3_blocker == null) { - t3_blocker = LockSupport.getBlocker(t3); - TimeUnit.MILLISECONDS.sleep(10); - } - System.out.println("t3 blocker is :" + t3_blocker); - t3.join(); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } -} diff --git a/src/main/java/com/javaedge/concurrency/LockSupportTest.java b/src/main/java/com/javaedge/concurrency/LockSupportTest.java deleted file mode 100644 index 6b3f543..0000000 --- a/src/main/java/com/javaedge/concurrency/LockSupportTest.java +++ /dev/null @@ -1,56 +0,0 @@ -package main.java.com.javaedge.concurrency; - -import java.util.concurrent.TimeUnit; -import java.util.concurrent.locks.LockSupport; - -/** - * @author JavaEdge - */ -public class LockSupportTest { - public static void main(String[] args) { - Thread t1 = new Thread() { - @Override - public void run() { - Thread.currentThread().setName("t1"); - System.out.println(Thread.currentThread().getName() + " before park"); - //park 100 seconds - LockSupport.parkNanos(TimeUnit.NANOSECONDS.convert(100, TimeUnit.SECONDS)); - System.out.println(Thread.currentThread().getName() + " after park"); - } - }; - Thread t2 = new Thread() { - @Override - public void run() { - try { - Thread.currentThread().setName("t2"); - TimeUnit.SECONDS.sleep(1); - System.out.println(Thread.currentThread().getName() + " unpark t1"); - LockSupport.unpark(t1); - } catch (InterruptedException e) { - e.printStackTrace(); - } - - } - }; - Thread t3 = new Thread() { - @Override - public void run() { - Thread.currentThread().setName("t3"); - System.out.println(Thread.currentThread().getName() + " park 5 seconds"); - //park 5 seconds - LockSupport.parkUntil(System.currentTimeMillis() + TimeUnit.MILLISECONDS.convert(5,TimeUnit.SECONDS)); - System.out.println(Thread.currentThread().getName() + " after park"); - } - }; - t1.start(); - t2.start(); - t3.start(); - try { - t1.join(); - t2.join(); - t3.join(); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } -} diff --git a/src/main/java/com/javaedge/concurrency/UnsafeTest.java b/src/main/java/com/javaedge/concurrency/UnsafeTest.java deleted file mode 100644 index 6459a0a..0000000 --- a/src/main/java/com/javaedge/concurrency/UnsafeTest.java +++ /dev/null @@ -1,59 +0,0 @@ -package main.java.com.javaedge.concurrency; - -import sun.misc.Unsafe; - -import java.lang.reflect.Field; -import java.util.concurrent.TimeUnit; - -/** - * @author JavaEdge - */ -public class UnsafeTest { - - public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException { - Field f = Unsafe.class.getDeclaredField("theUnsafe"); - f.setAccessible(true); - Unsafe unsafe = (Unsafe) f.get(null); - Thread t1 = new Thread(() -> { - Thread.currentThread().setName("t1"); - System.out.println(Thread.currentThread().getName() + " before park"); - //park 100 seconds - unsafe.park(false, TimeUnit.NANOSECONDS.convert(100, TimeUnit.SECONDS)); - System.out.println(Thread.currentThread().getName() + " after park"); - }); - Thread t2 = new Thread() { - @Override - public void run() { - try { - Thread.currentThread().setName("t2"); - TimeUnit.SECONDS.sleep(1); - System.out.println(Thread.currentThread().getName() + " unpark t1"); - unsafe.unpark(t1); - } catch (InterruptedException e) { - e.printStackTrace(); - } - - } - }; - Thread t3 = new Thread() { - @Override - public void run() { - Thread.currentThread().setName("t3"); - System.out.println(Thread.currentThread().getName() + " park 5 seconds"); - //park 5 seconds - unsafe.park(true, System.currentTimeMillis() + TimeUnit.MILLISECONDS.convert(5,TimeUnit.SECONDS)); - System.out.println(Thread.currentThread().getName() + " after park"); - } - }; - t1.start(); - t2.start(); - t3.start(); - try { - t1.join(); - t2.join(); - t3.join(); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } -} diff --git a/src/main/java/com/javaedge/concurrency/aqs/SampleLock.java b/src/main/java/com/javaedge/concurrency/aqs/SampleLock.java deleted file mode 100644 index b2334f1..0000000 --- a/src/main/java/com/javaedge/concurrency/aqs/SampleLock.java +++ /dev/null @@ -1,25 +0,0 @@ -package main.java.com.javaedge.concurrency.aqs; - -/** - * @author JavaEdge - * @date 2021/4/21 - */ -class SampleLock { - volatile int state; - - /** - * 加锁 - */ - void lock() { - // ... - state = 1; - } - - /** - * 解锁 - */ - void unlock() { - // ... - state = 0; - } -} diff --git a/src/main/java/com/javaedge/concurrency/aqs/SimpleLock.java b/src/main/java/com/javaedge/concurrency/aqs/SimpleLock.java deleted file mode 100644 index 86d9fdd..0000000 --- a/src/main/java/com/javaedge/concurrency/aqs/SimpleLock.java +++ /dev/null @@ -1,75 +0,0 @@ -package main.java.com.javaedge.concurrency.aqs; - -import java.util.concurrent.TimeUnit; -import java.util.concurrent.locks.AbstractQueuedSynchronizer; - -public class SimpleLock { - private static class Sync extends AbstractQueuedSynchronizer { - @Override - protected boolean tryAcquire(int ignore) { - return compareAndSetState(0, 1); - } - - @Override - protected boolean tryRelease(int ignore) { - setState(0); - return true; - } - - protected Sync() { - super(); - } - } - - private final Sync sync = new Sync(); - - public void lock() { - sync.acquire(1); - } - - public void unlock() { - sync.release(1); - } - - private static class MyThread extends Thread { - private final String name; - private final SimpleLock lock; - - private MyThread(String name, SimpleLock lock) { - this.name = name; - this.lock = lock; - } - - @Override - public void run() { - try { - lock.lock(); - System.out.println(name + " get the lock"); - TimeUnit.SECONDS.sleep(2); - } catch (InterruptedException e) { - e.printStackTrace(); - } finally { - lock.unlock(); - System.out.println(name + " release the lock"); - } - } - } - - public static void main(String[] args) { - final SimpleLock mutex = new SimpleLock(); - MyThread t1 = new MyThread("t1", mutex); - MyThread t2 = new MyThread("t2", mutex); - MyThread t3 = new MyThread("t3", mutex); - t1.start(); - t2.start(); - t3.start(); - try { - t1.join(); - t2.join(); - t3.join(); - } catch (InterruptedException e) { - e.printStackTrace(); - } - System.out.println("main thread exit!"); - } -} diff --git a/src/main/java/com/javaedge/concurrency/aqs/semaphore/MicrowaveOvenPool.java b/src/main/java/com/javaedge/concurrency/aqs/semaphore/MicrowaveOvenPool.java deleted file mode 100644 index 50ccf81..0000000 --- a/src/main/java/com/javaedge/concurrency/aqs/semaphore/MicrowaveOvenPool.java +++ /dev/null @@ -1,87 +0,0 @@ -package main.java.com.javaedge.concurrency.aqs.semaphore; - -import javax.validation.constraints.NotNull; -import java.util.List; -import java.util.Vector; -import java.util.concurrent.Semaphore; -import java.util.function.Function; - -/** - * @author JavaEdge - * @date 2021/4/22 - */ -class Food { - - public String name; - - private long warmTime; - - public Food(String name, long warmTime) { - this.name = name; - this.warmTime = warmTime; - } - - public String getName() { - return name; - } - - public long getWarmTime() { - return warmTime; - } -} - -class MicrowaveOven { - - public String name; - - public MicrowaveOven(String name) { - this.name = name; - } - - public Food warm(Food food) { - long second = food.getWarmTime() * 1000; - try { - Thread.sleep(second); - } catch (InterruptedException e) { - e.printStackTrace(); - } - - System.out.println(String.format("%s warm %s %d seconds food.", name, food.getName(), food.getWarmTime())); - return food; - } - - public String getName() { - return name; - } -} - -/** - * @author JavaEdge - */ -public class MicrowaveOvenPool { - - private List microwaveOvens; - - private Semaphore semaphore; - - public MicrowaveOvenPool(int size, @NotNull List microwaveOvens) { - this.microwaveOvens = new Vector<>(microwaveOvens); - this.semaphore = new Semaphore(size); - } - - public Food exec(Function func) { - MicrowaveOven microwaveOven = null; - try { - semaphore.acquire(); - microwaveOven = microwaveOvens.remove(0); - return func.apply(microwaveOven); - } catch (InterruptedException e) { - e.printStackTrace(); - } finally { - microwaveOvens.add(microwaveOven); - semaphore.release(); - } - return null; - } - -} diff --git a/src/main/java/com/javaedge/concurrency/aqs/semaphore/ObjPool.java b/src/main/java/com/javaedge/concurrency/aqs/semaphore/ObjPool.java deleted file mode 100644 index d1397cb..0000000 --- a/src/main/java/com/javaedge/concurrency/aqs/semaphore/ObjPool.java +++ /dev/null @@ -1,71 +0,0 @@ -package main.java.com.javaedge.concurrency.aqs.semaphore; - -import lombok.extern.slf4j.Slf4j; - -import java.util.List; -import java.util.Vector; -import java.util.concurrent.Semaphore; -import java.util.function.Function; - -/** - * @author JavaEdge - * @date 2021/4/22 - */ -@Slf4j -public class ObjPool { - - final List pool; - - /** - * 用信号量实现限流器 - */ - final Semaphore sem; - - ObjPool(int size, T t) { - // 使用线程安全的vector,因为信号量支持多个线程进入临界区 - // 执行 add、remove 方法时可能有并发 - pool = new Vector() {}; - for (int i = 0; i < size; i++) { - pool.add(t); - } - sem = new Semaphore(size); - } - - /** - * 利用对象池的对象,调用func - */ - R exec(Function func) throws InterruptedException { - T t = null; - // 前10个线程调用acquire()方法,都能继续执行,相当于通过了信号灯 - // 而其他线程则会阻塞在acquire() - sem.acquire(); - try { - // 通过信号灯的线程,为每个线程分配一个对象 t - t = pool.remove(0); - // 执行回调方法 - R apply = func.apply(t); - return apply; - } finally { - // 执行完回调后,释放对象 - pool.add(t); - - /** - * 更新信号量的计数器 - * 如果此时信号量里计数器的值≤0,说明有线程在等待 - * 此时会自动唤醒等待的线程 - */ - sem.release(); - } - } - - public static void main(String[] args) throws InterruptedException { - // 创建对象池 - ObjPool pool = new ObjPool<>(10, 2L); - // 通过对象池获取t,之后执行 - pool.exec(t -> { - log.info("t:{}", t); - return t.toString(); - }); - } -} - diff --git a/src/main/java/com/javaedge/concurrency/aqs/semaphore/SemaphoreExample5.java b/src/main/java/com/javaedge/concurrency/aqs/semaphore/SemaphoreExample5.java deleted file mode 100755 index b462d07..0000000 --- a/src/main/java/com/javaedge/concurrency/aqs/semaphore/SemaphoreExample5.java +++ /dev/null @@ -1,49 +0,0 @@ -package main.java.com.javaedge.concurrency.aqs.semaphore; - -import lombok.extern.slf4j.Slf4j; - -import java.util.Queue; - -/** - * @author JavaEdge - */ -@Slf4j -public class SemaphoreExample5 { - /** - * 计数器 - */ - int count; - - /** - * 等待队列 - */ - Queue queue; - - /** - * 初始化 - * - * @param c - */ - void Semaphore(int c){ - this.count=c; - } - - void down(){ - this.count--; - if(this.count<0){ - // 将当前线程插入等待队列 - // 阻塞当前线程 - } - } - void up(){ - this.count++; - if(this.count<=0) { - // 移除等待队列中的某个线程t - // 唤醒线程t - } - } - - public static void main(String[] args) { - - } -} diff --git a/src/main/java/com/javaedge/concurrency/aqs/semaphore/SemaphoreExample6.java b/src/main/java/com/javaedge/concurrency/aqs/semaphore/SemaphoreExample6.java deleted file mode 100755 index ecdd6ba..0000000 --- a/src/main/java/com/javaedge/concurrency/aqs/semaphore/SemaphoreExample6.java +++ /dev/null @@ -1,34 +0,0 @@ -package main.java.com.javaedge.concurrency.aqs.semaphore; - -import java.util.concurrent.Semaphore; - -/** - * @author JavaEdge - */ -public class SemaphoreExample6 { - - static int count; - - /** - * 初始化信号量 - */ - static final Semaphore SEMAPHORE = new Semaphore(1); - - /** - * 信号量保证互斥 - */ - static void add() throws InterruptedException { - // 进入临界区之前执行 - SEMAPHORE.acquire(); - try { - count += 1; - } finally { - // 退出临界区之前执行 - SEMAPHORE.release(); - } - } - - public static void main(String[] args) throws InterruptedException { - add(); - } -} diff --git a/src/main/java/com/javaedge/concurrency/common/Nap.java b/src/main/java/com/javaedge/concurrency/common/Nap.java deleted file mode 100644 index adb7c4c..0000000 --- a/src/main/java/com/javaedge/concurrency/common/Nap.java +++ /dev/null @@ -1,23 +0,0 @@ -package main.java.com.javaedge.concurrency.common; - -import java.util.concurrent.TimeUnit; - -/** - * @author JavaEdge - */ -public class Nap { - - // Seconds - public Nap(double t) { - try { - TimeUnit.MILLISECONDS.sleep((int) (1000 * t)); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } - } - - public Nap(double t, String msg) { - this(t); - System.out.println(msg); - } -} diff --git a/src/main/java/com/javaedge/concurrency/common/Timer.java b/src/main/java/com/javaedge/concurrency/common/Timer.java deleted file mode 100644 index 77a3da4..0000000 --- a/src/main/java/com/javaedge/concurrency/common/Timer.java +++ /dev/null @@ -1,24 +0,0 @@ -// onjava/Timer.java -// (c)2017 MindView LLC: see Copyright.txt -// We make no guarantees that this code is fit for any purpose. -// Visit http://OnJava8.com for more book information. -package main.java.com.javaedge.concurrency.common; - -import static java.util.concurrent.TimeUnit.NANOSECONDS; - -public class Timer { - private static long start = System.nanoTime(); - public static long duration() { - return NANOSECONDS.toMillis( - System.nanoTime() - start); - } - public static long duration(Runnable test) { - Timer timer = new Timer(); - test.run(); - return timer.duration(); - } - - public static void main(String[] args) { - duration(); - } -} diff --git a/src/main/java/com/javaedge/concurrency/common/stop/PrimeGenerator.java b/src/main/java/com/javaedge/concurrency/common/stop/PrimeGenerator.java deleted file mode 100644 index 9ac8877..0000000 --- a/src/main/java/com/javaedge/concurrency/common/stop/PrimeGenerator.java +++ /dev/null @@ -1,70 +0,0 @@ -package main.java.com.javaedge.concurrency.common.stop; - -import main.java.com.javaedge.concurrency.annoations.ThreadSafe; -import lombok.extern.slf4j.Slf4j; - -import javax.annotation.concurrent.GuardedBy; -import java.math.BigInteger; -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; - -import static java.util.concurrent.TimeUnit.SECONDS; - -/** - * @author JavaEdge - * @date 2021/5/8 - */ -@ThreadSafe -@Slf4j -public class PrimeGenerator implements Runnable { - private static ExecutorService exec = Executors.newCachedThreadPool(); - - @GuardedBy("this") - private final List primes = new ArrayList<>(); - private volatile boolean cancelled; - - @Override - public void run() { - BigInteger p = BigInteger.ONE; - // 主循环在搜索下一个素数之前会首先检查取消标志 - while (!cancelled) { - // 持续枚举素数,直到被取消 - p = p.nextProbablePrime(); - synchronized (this) { - primes.add(p); - } - } - } - - public void cancel() { - cancelled = true; - } - - public synchronized List get() { - return new ArrayList<>(primes); - } - - static List aSecondOfPrimes() throws InterruptedException { - PrimeGenerator generator = new PrimeGenerator(); - exec.execute(generator); - try { - - /** - * 素数生成器通常并不会刚好在运行 1s 后停止,因为在 请求取消的时刻 和 run方法中循环执行下一次检查 之间可能存在延迟 - */ - SECONDS.sleep(1); - } finally { - // cancel方法由finally块调用,从而确保即使在调用sleep时被中断,也能取消素数生成器的执行 - // 如果cancel没有被调用,那么搜索素数的线程将永远运行下去,不断消耗CPU时钟周期,且使得JVM不能正常退出 - generator.cancel(); - } - return generator.get(); - } - - public static void main(String[] args) throws InterruptedException { - log.info("result:{}", aSecondOfPrimes()); - } -} - diff --git a/src/main/java/com/javaedge/concurrency/condition/BlockedQueue.java b/src/main/java/com/javaedge/concurrency/condition/BlockedQueue.java deleted file mode 100644 index 75936aa..0000000 --- a/src/main/java/com/javaedge/concurrency/condition/BlockedQueue.java +++ /dev/null @@ -1,58 +0,0 @@ -package main.java.com.javaedge.concurrency.condition; - -import java.util.concurrent.locks.Condition; -import java.util.concurrent.locks.Lock; -import java.util.concurrent.locks.ReentrantLock; - -/** - * @author JavaEdge - * @date 2021/4/21 - */ -public class BlockedQueue { - - final Lock lock = new ReentrantLock(); - - /** - * 条件变量:队列不满 - */ - final Condition notFull = lock.newCondition(); - - /** - * 条件变量:队列不空 - */ - final Condition notEmpty = lock.newCondition(); - - void enq(T x) { - lock.lock(); - try { -// while (队列已满) { - while (x!=null) { - // 等待队列不满 - notFull.await(); - } - // 省略入队操作 - // 入队后,通知可出队 - notEmpty.signal(); - } catch (InterruptedException e) { - e.printStackTrace(); - } finally { - lock.unlock(); - } - } - - void deq() throws InterruptedException { - lock.lock(); - try { -// while (队列已空) { - while (true) { - // 等待队列不空 - notEmpty.await(); - } - // 省略出队操作 - // 出队后,通知可入队 -// notFull.signal(); - } finally { - lock.unlock(); - } - } -} diff --git a/src/main/java/com/javaedge/concurrency/condition/DubboCondition.java b/src/main/java/com/javaedge/concurrency/condition/DubboCondition.java deleted file mode 100644 index 17f492c..0000000 --- a/src/main/java/com/javaedge/concurrency/condition/DubboCondition.java +++ /dev/null @@ -1,85 +0,0 @@ -package main.java.com.javaedge.concurrency.condition; - -import redis.clients.jedis.Response; - -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; -import java.util.concurrent.locks.Condition; -import java.util.concurrent.locks.Lock; -import java.util.concurrent.locks.ReentrantLock; - -/** - * @author JavaEdge - * @date 2021/4/21 - */ -public class DubboCondition { - - Response response; - /** - * 创建锁 - */ - private final Lock lock = new ReentrantLock(); - - /** - * 创建条件变量 - */ - private final Condition done = lock.newCondition(); - - /** - * 调用方通过该方法等待结果 - * - * @param timeout - * @return - */ - Object get(int timeout) throws TimeoutException { - long start = System.nanoTime(); - // 获取锁 - lock.lock(); - try { - while (!isDone()) { - // 获取锁后,通过经典的在循环中调用await()方法来实现等待。 - done.await(timeout, TimeUnit.SECONDS); - long cur = System.nanoTime(); - if (isDone() || - cur - start > timeout) { - break; - } - } - } catch (InterruptedException e) { - e.printStackTrace(); - } finally { - // 释放锁 - lock.unlock(); - } - if (!isDone()) { - throw new TimeoutException(); - } -// return returnFromResponse(); - return null; - } - - /** - * RPC结果是否已经返回 - * - * @return - */ - boolean isDone() { - return response != null; - } - - // RPC结果返回时调用该方法 - private void doReceived(Response res) { - // 获取锁 - lock.lock(); - try { - response = res; - if (done != null) { - // 通知调用线程,结果已经返回,不用继续等待 - done.signal(); - } - } finally { - // 释放锁 - lock.unlock(); - } - } -} diff --git a/src/main/java/com/javaedge/concurrency/forkjoin/ForkJoinTaskExample2.java b/src/main/java/com/javaedge/concurrency/forkjoin/ForkJoinTaskExample2.java deleted file mode 100755 index 4621040..0000000 --- a/src/main/java/com/javaedge/concurrency/forkjoin/ForkJoinTaskExample2.java +++ /dev/null @@ -1,52 +0,0 @@ -package main.java.com.javaedge.concurrency.forkjoin; - -import lombok.extern.slf4j.Slf4j; - -import java.util.concurrent.ForkJoinPool; -import java.util.concurrent.RecursiveTask; - -/** - * @author JavaEdge - */ -@Slf4j -public class ForkJoinTaskExample2 { - public static void main(String[] args) { - // 创建分治任务线程池 - ForkJoinPool forkJoinPool = new ForkJoinPool(4); - - // 创建分治任务 - Fibonacci fib = new Fibonacci(30); - - // 启动分治任务 - Integer result = forkJoinPool.invoke(fib); - - System.out.println(result); - } - - /** - * 数列的递归任务 需要有返回值 - */ - static class Fibonacci extends RecursiveTask { - final int n; - - Fibonacci(int n) { - this.n = n; - } - - @Override - protected Integer compute() { - if (n <= 1) { - return n; - } - - Fibonacci f1 = new Fibonacci(n - 1); - - // 创建子任务 - f1.fork(); - Fibonacci f2 = new Fibonacci(n - 2); - - // 等待子任务结果,并合并结果 - return f2.compute() + f1.join(); - } - } -} diff --git a/src/main/java/com/javaedge/concurrency/forkjoin/ForkJoinTaskExample3.java b/src/main/java/com/javaedge/concurrency/forkjoin/ForkJoinTaskExample3.java deleted file mode 100755 index a33e195..0000000 --- a/src/main/java/com/javaedge/concurrency/forkjoin/ForkJoinTaskExample3.java +++ /dev/null @@ -1,193 +0,0 @@ -package main.java.com.javaedge.concurrency.forkjoin; - -import lombok.extern.slf4j.Slf4j; -import org.junit.Test; - -import java.util.Arrays; -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.ForkJoinPool; -import java.util.concurrent.RecursiveTask; - -/** - * @author JavaEdge - */ -@Slf4j -public class ForkJoinTaskExample3 { - - public static void main(String[] args) { - String[] fc = {"hello world", - "hello me", - "hello fork", - "hello join", - "fork join in world"}; - //创建ForkJoin线程池 - ForkJoinPool fjp = new ForkJoinPool(3); - //创建任务 - MR mr = new MR(fc, 0, fc.length); - //启动任务 - Map result = fjp.invoke(mr); - //输出结果 - result.forEach((k, v) -> System.out.println(k + ":" + v)); - } - - /** - * MR模拟类 - */ - static class MR extends RecursiveTask> { - private String[] fc; - private int start, end; - - /** - * 构造函数 - * - * @param fc - * @param fr - * @param to - */ - MR(String[] fc, int fr, int to) { - this.fc = fc; - this.start = fr; - this.end = to; - } - - @Override - protected Map compute() { - if (end - start == 1) { - return calc(fc[start]); - } else { - int mid = (start + end) / 2; - MR mr1 = new MR(fc, start, mid); - // 前半部分数据fork一个递归任务去处理 - mr1.fork(); - MR mr2 = new MR(fc, mid, end); - //计算子任务,并返回合并的结果 后半部分数据则在当前任务中递归处理:mr2.compute() - // 如果join在前面会先首先让当前线程阻塞在join()上。当join()执行完才会执行mr2.compute(),这样并行度会降低 - /** - * 为什么不能merge mr1.compute和mr2..compute或者mr1.join和mr2的join呢? - * compute+compute相当于没用forkjoin,都在一个线程里跑的。 - * 如果用join+join也可以,不过jdk官方有个建议,顺序要用:a.fork(); b.fork(); b.join(); a.join();否则性能有问题。 - * 所以还是用fork+compute更简单 - */ - return merge(mr2.compute(), mr1.join()); - } - } - - /** - * 合并结果 - * - * @param r1 - * @param r2 - * @return - */ - private Map merge( - Map r1, - Map r2) { - Map result = new HashMap<>(); - result.putAll(r1); - //合并结果 - r2.forEach((k, v) -> { - Long c = result.get(k); - if (c != null) { - result.put(k, c + v); - } else { - result.put(k, v); - } - }); - return result; - } - - //统计单词数量 - private Map - calc(String line) { - Map result = - new HashMap<>(); - //分割单词 - String[] words = - line.split("\\s+"); - //统计单词数量 - for (String w : words) { - Long v = result.get(w); - if (v != null) { - result.put(w, v + 1); - } else { - result.put(w, 1L); - } - } - return result; - } - } - - /** - * Ryzen 1700 8核16线程 3.0 GHz - */ - @Test - public void mergeSort() { - long[] arrs = new long[100000000]; - for (int i = 0; i < 100000000; i++) { - arrs[i] = (long) (Math.random() * 100000000); - } - long startTime = System.currentTimeMillis(); - ForkJoinPool forkJoinPool = new ForkJoinPool(Runtime.getRuntime().availableProcessors()); - MergeSort mergeSort = new MergeSort(arrs); -// arrs = forkJoinPool.invoke(mergeSort); - //传统递归 - arrs = mergeSort(arrs); - long endTime = System.currentTimeMillis(); - System.out.println("耗时:" + (endTime - startTime)); - } - - /** - * 传统递归 - * 耗时: - */ - public static long[] mergeSort(long[] arrs) { - if (arrs.length < 2) { - return arrs; - } - int mid = arrs.length / 2; - long[] left = Arrays.copyOfRange(arrs, 0, mid); - long[] right = Arrays.copyOfRange(arrs, mid, arrs.length); - return merge(mergeSort(left), mergeSort(right)); - } - - public static long[] merge(long[] left, long[] right) { - long[] result = new long[left.length + right.length]; - for (int i = 0, m = 0, j = 0; m < result.length; m++) { - if (i >= left.length) { - result[m] = right[j++]; - } else if (j >= right.length) { - result[m] = left[i++]; - } else if (left[i] > right[j]) { - result[m] = right[j++]; - } else { - result[m] = left[i++]; - } - } - return result; - } - - /** - * fork/join - * 耗时:14853 ms - */ - class MergeSort extends RecursiveTask { - long[] arrs; - - public MergeSort(long[] arrs) { - this.arrs = arrs; - } - - @Override - protected long[] compute() { - if (arrs.length < 2) { - return arrs; - } - int mid = arrs.length / 2; - MergeSort left = new MergeSort(Arrays.copyOfRange(arrs, 0, mid)); - left.fork(); - MergeSort right = new MergeSort(Arrays.copyOfRange(arrs, mid, arrs.length)); - return merge(right.compute(), left.join()); - } - } -} diff --git a/src/main/java/com/javaedge/concurrency/furure/guava/FutureExample.java b/src/main/java/com/javaedge/concurrency/furure/guava/FutureExample.java deleted file mode 100755 index 8af249d..0000000 --- a/src/main/java/com/javaedge/concurrency/furure/guava/FutureExample.java +++ /dev/null @@ -1,52 +0,0 @@ -package main.java.com.javaedge.concurrency.furure.guava; - -import com.google.common.util.concurrent.*; -import lombok.extern.slf4j.Slf4j; - -import javax.annotation.Nullable; -import java.util.concurrent.Callable; -import java.util.concurrent.Executors; - -/** - * @author JavaEdge - */ -@Slf4j -public class FutureExample { - - static class MyCallable implements Callable { - - @Override - public String call() throws Exception { - log.info("do something in callable"); - Thread.sleep(5000); - return "Done"; - } - } - - public static void main(String[] args) throws Exception { - // 装饰器模式 - ListeningExecutorService service = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(2)); - - ListenableFuture future = service.submit(new MyCallable()); - - System.out.println(future.hashCode()); - - // 异步非阻塞:观察者模式 当ListenableFuture完成时,需要执行的程序 - Futures.addCallback(future, new FutureCallback() { - @Override - public void onSuccess(@Nullable String s) { - - } - - @Override - public void onFailure(Throwable throwable) { - throwable.printStackTrace(); - } - }, service); - - log.info("do something in main"); - Thread.sleep(1000); - String result = future.get(); - log.info("result:{}", result); - } -} diff --git a/src/main/java/com/javaedge/concurrency/furure/jdk/CompletableFurureDemo3.java b/src/main/java/com/javaedge/concurrency/furure/jdk/CompletableFurureDemo3.java deleted file mode 100644 index d913677..0000000 --- a/src/main/java/com/javaedge/concurrency/furure/jdk/CompletableFurureDemo3.java +++ /dev/null @@ -1,65 +0,0 @@ -package main.java.com.javaedge.concurrency.furure.jdk; - -import org.junit.Test; - -import java.time.LocalDateTime; -import java.util.List; -import java.util.concurrent.*; -import java.util.concurrent.locks.LockSupport; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -/** - * @author JavaEdge - * @date 2022/5/28 - */ -public class CompletableFurureDemo3 { - - @Test - public void CompletableFutureAndExecutor() { - Stream integerStream = Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); - ExecutorService executor = Executors.newFixedThreadPool((int) integerStream.count()); - List> futureList = integerStream - .map(operand -> - CompletableFuture.supplyAsync(() -> { - getThreadName(); - return 1; - }, executor - ) - ).collect(Collectors.toList()); - long count = futureList.stream().map(CompletableFuture::join).count(); - System.out.println(count); - } - - /** - * 使用CountDownLatch改造主线程阻塞直到任务都完成 - * @throws InterruptedException - */ - @Test - public void CompletableFutureAndExecutor2() throws InterruptedException { - Stream integerStream = Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); - CountDownLatch countDownLatch = new CountDownLatch(10); - ExecutorService executor = Executors.newFixedThreadPool(10); -// ExecutorService executor = Executors.newFixedThreadPool((int) integerStream.count()); FIXME bug写法 - List> futureList = integerStream - .map(operand -> - CompletableFuture.supplyAsync(() -> { - getThreadName(); - countDownLatch.countDown(); - return 1; - }, executor - ) - ).collect(Collectors.toList()); - countDownLatch.await(10, TimeUnit.MINUTES); - long count = futureList.stream().map(CompletableFuture::join).count(); - System.out.println(count); - } - - private void getThreadName() { - // sleep 1秒 - LockSupport.parkNanos(TimeUnit.SECONDS.toNanos(1)); - String time = LocalDateTime.now().toLocalTime().toString(); - String name = Thread.currentThread().getName(); - System.out.println(time + " " + name); - } -} diff --git a/src/main/java/com/javaedge/concurrency/furure/jdk/CompletableFutureDemo.java b/src/main/java/com/javaedge/concurrency/furure/jdk/CompletableFutureDemo.java deleted file mode 100644 index 47e25f1..0000000 --- a/src/main/java/com/javaedge/concurrency/furure/jdk/CompletableFutureDemo.java +++ /dev/null @@ -1,56 +0,0 @@ -package main.java.com.javaedge.concurrency.furure.jdk; - -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -import java.util.concurrent.*; - -/** - * @author JavaEdge - * @date 2021/4/15 - */ -@Slf4j -public class CompletableFutureDemo { - - @AllArgsConstructor - private static class MyTask implements Callable { - - private String name; - private int timeInSeconds; - private boolean ret; - - @Override - public Boolean call() { - // 模拟业务执行时间 - // 实际中时间不固定,可能在处理计算任务, - try { - Thread.sleep(timeInSeconds); - } catch (InterruptedException e) { - e.printStackTrace(); - } - System.out.println(name + " task callback"); - return ret; - } - } - - public static void main(String[] args) throws Exception { - MyTask task1 = new MyTask("task1", 3, true); - MyTask task2 = new MyTask("task2", 4, true); - MyTask task3 = new MyTask("task3", 1, false); - - CompletableFuture f1 = CompletableFuture.supplyAsync(task1::call).thenAccept((result) -> callback(result)); - - CompletableFuture f2 = CompletableFuture.supplyAsync(task2::call).thenAccept((result) -> callback(result)); - - CompletableFuture f3 = CompletableFuture.supplyAsync(task3::call).thenAccept((result) -> callback(result)); - - System.in.read(); - } - - private static void callback(Boolean result) { - if (!result) { - // 处理结束流程 通知其他线程结束(回滚) 超时处理 - System.exit(0); - } - } -} diff --git a/src/main/java/com/javaedge/concurrency/furure/jdk/CompletableFutureDemo2.java b/src/main/java/com/javaedge/concurrency/furure/jdk/CompletableFutureDemo2.java deleted file mode 100644 index b8714e7..0000000 --- a/src/main/java/com/javaedge/concurrency/furure/jdk/CompletableFutureDemo2.java +++ /dev/null @@ -1,65 +0,0 @@ -package main.java.com.javaedge.concurrency.furure.jdk; - -import lombok.extern.slf4j.Slf4j; - -import java.util.Random; -import java.util.concurrent.CompletableFuture; - -/** - * @author JavaEdge - * @date 2021/4/15 - */ -@Slf4j -public class CompletableFutureDemo2 { - - public static void main(String[] args) throws Exception { - CompletableFuture future1 = CompletableFuture - // 1 - .supplyAsync(() -> "Hello World") - // 2 - .thenApply(s -> s + " Java") - // 3 - .thenApply(String::toUpperCase); - System.out.println(future1.join()); - -// CompletableFuture future2 = CompletableFuture -// .supplyAsync(() -> (1 / 0)) -// .thenApply(r -> r * 2); -// System.out.println(future2.join()); - - CompletableFuture future3 = CompletableFuture - .supplyAsync(() -> 1 / 0) - .thenApply(r -> r * 2) - .exceptionally(e -> 0); - System.out.println(future3.join()); - - Random rand = new Random(47); - CompletableFuture f1 = - CompletableFuture.supplyAsync(() -> { - int t = rand.nextInt(20); - try { - Thread.sleep(t); - } catch (InterruptedException e) { - e.printStackTrace(); - } - return String.valueOf(t); - }); - - CompletableFuture f2 = - CompletableFuture.supplyAsync(() -> { - int t = rand.nextInt(); - try { - Thread.sleep(t); - } catch (InterruptedException e) { - e.printStackTrace(); - } - return String.valueOf(t); - }); - - CompletableFuture f3 = - f1.applyToEither(f2, s -> s); - - System.out.println(f3.join()); - - } -} diff --git a/src/main/java/com/javaedge/concurrency/furure/jdk/CompletionServiceDemo.java b/src/main/java/com/javaedge/concurrency/furure/jdk/CompletionServiceDemo.java deleted file mode 100644 index 76cb04b..0000000 --- a/src/main/java/com/javaedge/concurrency/furure/jdk/CompletionServiceDemo.java +++ /dev/null @@ -1,144 +0,0 @@ -package main.java.com.javaedge.concurrency.furure.jdk; - -import java.util.concurrent.*; -import java.util.concurrent.atomic.AtomicReference; - -/** - * @author JavaEdge - * @date 2021/4/18 - */ -public class CompletionServiceDemo { - -// public static void main(String[] args) throws InterruptedException, ExecutionException { -// test1(); -// -// test2(); -// -// test3(); -// } - - public static void main(String[] args) throws ExecutionException, InterruptedException { - test0(); - } - - private static void test0() throws ExecutionException, InterruptedException { - ExecutorService executor = Executors.newFixedThreadPool(3); - Future f1 = executor.submit(() -> getPrice1()); - Future f2 = executor.submit(() -> getPrice2()); - Future f3 = executor.submit(() -> getPrice3()); - - executor.execute(() -> { - try { - save(f1.get()); - } catch (InterruptedException e) { - e.printStackTrace(); - } catch (ExecutionException e) { - e.printStackTrace(); - } - }); - executor.execute(() -> { - try { - save(f2.get()); - } catch (InterruptedException e) { - e.printStackTrace(); - } catch (ExecutionException e) { - e.printStackTrace(); - } - }); - executor.execute(() -> { - try { - save(f3.get()); - } catch (InterruptedException e) { - e.printStackTrace(); - } catch (ExecutionException e) { - e.printStackTrace(); - } - }); - f3.get(); - } - - private static AtomicReference test3() { - - ExecutorService executor = Executors.newFixedThreadPool(3); - CompletionService completionService = new ExecutorCompletionService<>(executor); - - // 异步查询价格 - completionService.submit(CompletionServiceDemo::getPrice1); - completionService.submit(CompletionServiceDemo::getPrice2); - completionService.submit(CompletionServiceDemo::getPrice3); - // 将查询结果异步保存 - // 并计算最低价格 - AtomicReference m = new AtomicReference<>(Integer.MAX_VALUE); - for (int i = 0; i < 3; i++) { - executor.execute(() -> { - Integer r = null; - try { - r = completionService.take().get(); - } catch (Exception e) { - e.printStackTrace(); - } - save(r); - m.set(Integer.min(m.get(), r)); - }); - } - return m; - } - - private static void test2() throws InterruptedException, ExecutionException { - ExecutorService executor = Executors.newFixedThreadPool(3); - CompletionService cs = new ExecutorCompletionService<>(executor); - - // 异步查询 - cs.submit(CompletionServiceDemo::getPrice1); - cs.submit(CompletionServiceDemo::getPrice2); - cs.submit(CompletionServiceDemo::getPrice3); - - // 将结果异步保存 - for (int i = 0; i < 3; i++) { - Integer r = cs.take().get(); - executor.execute(() -> save(r)); - } - } - - private static void test1() throws ExecutionException, InterruptedException { - - ExecutorService executor = Executors.newFixedThreadPool(3); - - // 异步查询 - Future f1 = executor.submit(CompletionServiceDemo::getPrice1); - - Future f2 = executor.submit(CompletionServiceDemo::getPrice2); - - Future f3 = executor.submit(CompletionServiceDemo::getPrice3); - - Integer r; - // 获取各个价格并保存 - r = f1.get(); - Integer finalR = r; - executor.execute(() -> save(finalR)); - - r = f2.get(); - Integer finalR1 = r; - executor.execute(() -> save(finalR1)); - - r = f3.get(); - Integer finalR2 = r; - executor.execute(() -> save(finalR2)); - } - - private static void save(Integer r) { - System.out.println("r" + r); - } - - private static Integer getPrice3() { - return 3; - } - - private static Integer getPrice2() { - return 2; - } - - private static Integer getPrice1() { - return 1; - } -} diff --git a/src/main/java/com/javaedge/concurrency/furure/jdk/Machina.java b/src/main/java/com/javaedge/concurrency/furure/jdk/Machina.java deleted file mode 100644 index 3ddb7e1..0000000 --- a/src/main/java/com/javaedge/concurrency/furure/jdk/Machina.java +++ /dev/null @@ -1,43 +0,0 @@ -package main.java.com.javaedge.concurrency.furure.jdk; - - -import com.javaedge.concurrency.common.Nap; - -/** - * @author JavaEdge - */ -public class Machina { - - public enum State { - START, ONE, TWO, THREE, END; - - State step() { - if (equals(END)) { - return END; - } - return values()[ordinal() + 1]; - } - } - - private State state = State.START; - private final int id; - - public Machina(int id) { - this.id = id; - } - - public static Machina work(Machina m) { - if (!m.state.equals(State.END)) { - new Nap(0.1); - m.state = m.state.step(); - } - System.out.println(m); - return m; - } - - @Override - public String toString() { - return "Machina" + id + ": " + - (state.equals(State.END) ? "complete" : state); - } -} diff --git a/src/main/java/com/javaedge/concurrency/lock/Account.java b/src/main/java/com/javaedge/concurrency/lock/Account.java deleted file mode 100644 index b45f34e..0000000 --- a/src/main/java/com/javaedge/concurrency/lock/Account.java +++ /dev/null @@ -1,71 +0,0 @@ -package main.java.com.javaedge.concurrency.lock; - -import java.util.Random; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.locks.Lock; -import java.util.concurrent.locks.ReentrantLock; - - -/** - * @author JavaEdge - * @date 2021/4/21 - */ -class Account { - - private int balance; - - private final Lock lock = new ReentrantLock(); - - /** - * 转账 - * - * @param target 目标账户 - * @param amount 转账金额 - */ - void errorTransfer(Account target, int amount) { - while (true) { - if (this.lock.tryLock()) { - try { - if (target.lock.tryLock()) { - try { - this.balance -= amount; - target.balance += amount; - } finally { - target.lock.unlock(); - } - } else { - // nothing - } - } finally { - this.lock.unlock(); - } - } else { - // nothing - } - } - } - - void correctTransfer(Account tar, int amt) throws InterruptedException { - while (true) { - if (this.lock.tryLock(new Random().nextLong(), TimeUnit.NANOSECONDS)) { - try { - if (tar.lock.tryLock(new Random().nextLong(), TimeUnit.NANOSECONDS)) { - try { - this.balance -= amt; - tar.balance += amt; - break; - } finally { - tar.lock.unlock(); - } - } else { - // nothing - } - } finally { - this.lock.unlock(); - } - } else { - // nothing - } - } - } -} diff --git a/src/main/java/com/javaedge/concurrency/lock/CacheDemo1.java b/src/main/java/com/javaedge/concurrency/lock/CacheDemo1.java deleted file mode 100644 index aa7cea3..0000000 --- a/src/main/java/com/javaedge/concurrency/lock/CacheDemo1.java +++ /dev/null @@ -1,46 +0,0 @@ -package main.java.com.javaedge.concurrency.lock; - -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.locks.Lock; -import java.util.concurrent.locks.ReadWriteLock; -import java.util.concurrent.locks.ReentrantReadWriteLock; - -/** - * @author JavaEdge - * @date 2021/4/22 - */ -public class CacheDemo1 { - - final Map m = new HashMap(); - - final ReadWriteLock rwl = new ReentrantReadWriteLock(); - - final Lock r = rwl.readLock(); - - final Lock w = rwl.writeLock(); - - Data get(String key) { - r.lock(); - try { - return m.get(key); - } finally { - r.unlock(); - } - } - - Data put(String key, Data v) { - w.lock(); - try { - return m.put(key, v); - } finally { - w.unlock(); - } - } - - class Data { } - - public static void main(String[] args) { - - } -} diff --git a/src/main/java/com/javaedge/concurrency/lock/CacheDemo2.java b/src/main/java/com/javaedge/concurrency/lock/CacheDemo2.java deleted file mode 100644 index 5685fb2..0000000 --- a/src/main/java/com/javaedge/concurrency/lock/CacheDemo2.java +++ /dev/null @@ -1,72 +0,0 @@ -package main.java.com.javaedge.concurrency.lock; - -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.locks.Lock; -import java.util.concurrent.locks.ReadWriteLock; -import java.util.concurrent.locks.ReentrantReadWriteLock; - -/** - * @author JavaEdge - * @date 2021/4/22 - */ -public class CacheDemo2 { - - public static void main(String[] args) { - } - - final Map m = new HashMap<>(); - final ReadWriteLock readWriteLock = new ReentrantReadWriteLock(); - final Lock readLock = readWriteLock.readLock(); - final Lock writeLock = readWriteLock.writeLock(); - - V get(K key) { - V v = null; - // 1.加读锁 - readLock.lock(); - try { - // 2.读缓存 - v = m.get(key); - if (v == null) { - writeLock.lock(); - try { - // 再次验证并更新缓存 - } finally { - writeLock.unlock(); - } - } - } finally { - // 3.释放锁 - readLock.unlock(); - } - // 4.缓存中存在,返回 - if (v != null) { - return v; - } - - /** - * 5.若缓存中没有缓存目标对象,就需要从 DB 加载,然后写入缓存. - * 写缓存需要用到写锁 - */ - writeLock.lock(); - try { - - /** - * 6. - * 获取写锁后,并非直接去查询DB. - * 先再验证一次缓存中是否存在,因为高并发场景下,其他线程可能已查询过 DB - */ - v = m.get(key); - // 7 - if (v == null) { - // 再次验证如果还是不存在,才去查询DB - v = null; - // 并更新本地缓存 - m.put(key, v); - } - } finally { - writeLock.unlock(); - } - return v; - } -} diff --git a/src/main/java/com/javaedge/concurrency/lock/CacheDemo3.java b/src/main/java/com/javaedge/concurrency/lock/CacheDemo3.java deleted file mode 100644 index fb3be1e..0000000 --- a/src/main/java/com/javaedge/concurrency/lock/CacheDemo3.java +++ /dev/null @@ -1,59 +0,0 @@ -package main.java.com.javaedge.concurrency.lock; - -import java.util.concurrent.locks.Lock; -import java.util.concurrent.locks.ReadWriteLock; -import java.util.concurrent.locks.ReentrantReadWriteLock; - -/** - * @author JavaEdge - * @date 2021/4/22 - */ -public class CacheDemo3 { - - Object data; - - volatile boolean cacheValid; - - final ReadWriteLock readWriteLock = new ReentrantReadWriteLock(); - - final Lock readLock = readWriteLock.readLock(); - - final Lock writeLock = readWriteLock.writeLock(); - - void processCachedData() { - // 获取读锁 - readLock.lock(); - if (!cacheValid) { - // 释放读锁,因为不允许读锁的升级 - readLock.unlock(); - // 获取写锁 - writeLock.lock(); - try { - // 再次检查状态 - if (!cacheValid) { - // 省略具体代码 - data = null; - cacheValid = true; - } - /** - * 1.获取读锁的时候线程还是持有写锁的 - * 释放写锁前,降级为读锁 - * 这种锁的降级是支持的 - */ - readLock.lock(); - } finally { - // 释放写锁 - writeLock.unlock(); - } - } - // 此处仍持有读锁 - try { - use(data); - } finally { - readLock.unlock(); - } - } - - private void use(Object data) { - } -} \ No newline at end of file diff --git a/src/main/java/com/javaedge/concurrency/lock/LockTest.java b/src/main/java/com/javaedge/concurrency/lock/LockTest.java deleted file mode 100644 index 86021b5..0000000 --- a/src/main/java/com/javaedge/concurrency/lock/LockTest.java +++ /dev/null @@ -1,25 +0,0 @@ -package main.java.com.javaedge.concurrency.lock; - -import java.util.concurrent.locks.Lock; -import java.util.concurrent.locks.ReentrantLock; - -/** - * @author JavaEdge - * @date 2021/4/21 - */ -public class LockTest { - private final Lock reentrantLock = new ReentrantLock(); - int value; - - public void add() { - // 获取锁 - reentrantLock.lock(); - try { - // 若线程 t1 执行 value+=1,那后续线程t2能看到value正确值吗? - value += 1; - } finally { - // 保证锁能释放 - reentrantLock.unlock(); - } - } -} diff --git a/src/main/java/com/javaedge/concurrency/lock/LockTest2.java b/src/main/java/com/javaedge/concurrency/lock/LockTest2.java deleted file mode 100644 index ea86ce5..0000000 --- a/src/main/java/com/javaedge/concurrency/lock/LockTest2.java +++ /dev/null @@ -1,38 +0,0 @@ -package main.java.com.javaedge.concurrency.lock; - -import java.util.concurrent.locks.Lock; -import java.util.concurrent.locks.ReentrantLock; - -/** - * @author JavaEdge - * @date 2021/4/21 - */ -public class LockTest2 { - private final Lock reentrantLock = new ReentrantLock(); - int value; - - public int get() { - // 2.获取锁 - // 此时,若锁可重入,则t1可再次加锁 - // 若不可重入,则t1此时会被阻塞 - reentrantLock.lock(); - try { - return value; - } finally { - // 保证锁能释放 - reentrantLock.unlock(); - } - } - - public void add() { - // 获取锁 - reentrantLock.lock(); - try { - // 1.线程 t1 此时已经获取到锁 - value = 1 + get(); - } finally { - // 确保释放锁 - reentrantLock.unlock(); - } - } -} diff --git a/src/main/java/com/javaedge/concurrency/lock/Point.java b/src/main/java/com/javaedge/concurrency/lock/Point.java deleted file mode 100644 index 6b84f32..0000000 --- a/src/main/java/com/javaedge/concurrency/lock/Point.java +++ /dev/null @@ -1,42 +0,0 @@ -package main.java.com.javaedge.concurrency.lock; - -import java.util.concurrent.locks.StampedLock; - -/** - * @author JavaEdge - * @date 2021/4/23 - */ -class Point { - private int x, y; - final StampedLock stampedLock = new StampedLock(); - - /** - * 计算到原点的距离 - */ - public int distanceFromOrigin() { - - // 1.乐观读,是无锁的 - long stamp = stampedLock.tryOptimisticRead(); - - // 2.由于乐观读是无锁的,所以共享变量x、y读入局部变量时,x、y可能被其他线程修改 - int curX = x, curY = y; - - /** - * 3.所以读完后,还要再验证是否存在写操作 - * 判断执行读操作期间,是否存在写操作 - * 若存在,则stampedLock.validate会返回false - */ - if (!stampedLock.validate(stamp)) { - // 升级为悲观读锁 - stamp = stampedLock.readLock(); - try { - curX = x; - curY = y; - } finally { - // 释放悲观读锁 - stampedLock.unlockRead(stamp); - } - } - return (int) Math.sqrt(curX * curX + curY * curY); - } -} diff --git a/src/main/java/com/javaedge/concurrency/lock/TicketLock.java b/src/main/java/com/javaedge/concurrency/lock/TicketLock.java deleted file mode 100644 index 5d12bb5..0000000 --- a/src/main/java/com/javaedge/concurrency/lock/TicketLock.java +++ /dev/null @@ -1,25 +0,0 @@ -package main.java.com.javaedge.concurrency.lock; - -import java.util.concurrent.atomic.AtomicInteger; - -public class TicketLock { - private AtomicInteger serviceNum = new AtomicInteger(); // 服务号 - private AtomicInteger ticketNum = new AtomicInteger(); // 排队号 - - public int lock() { - // 首先原子性地获得一个排队号 - int myTicketNum = ticketNum.getAndIncrement(); - - // 只要当前服务号不是自己的就不断轮询 - while (serviceNum.get() != myTicketNum) { - } - - return myTicketNum; - } - - public void unlock(int myTicket) { - // 只有当前线程拥有者才能释放锁 - int next = myTicket + 1; - serviceNum.compareAndSet(myTicket, next); - } -} diff --git a/src/main/java/com/javaedge/concurrency/order/OrderSpec.java b/src/main/java/com/javaedge/concurrency/order/OrderSpec.java deleted file mode 100644 index e69de29..0000000 diff --git a/src/main/java/com/javaedge/concurrency/streams/ParallelPrime.java b/src/main/java/com/javaedge/concurrency/streams/ParallelPrime.java deleted file mode 100644 index 0b12d29..0000000 --- a/src/main/java/com/javaedge/concurrency/streams/ParallelPrime.java +++ /dev/null @@ -1,40 +0,0 @@ -package main.java.com.javaedge.concurrency.streams; - -import com.javaedge.concurrency.common.Timer; - -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.nio.file.StandardOpenOption; -import java.util.List; -import java.util.stream.Collectors; - -import static java.util.stream.LongStream.iterate; -import static java.util.stream.LongStream.rangeClosed; - -/** - * @author JavaEdge - */ -public class ParallelPrime { - static final int COUNT = 100_000; - - public static boolean isPrime(long n) { - return rangeClosed(2, (long) Math.sqrt(n)) - .noneMatch(i -> n % i == 0); - } - - public static void main(String[] args) - throws IOException { - Timer timer = new Timer(); - List primes = - iterate(2, i -> i + 1) - .parallel() - .filter(ParallelPrime::isPrime) - .limit(COUNT) - .mapToObj(Long::toString) - .collect(Collectors.toList()); - System.out.println(timer.duration()); - Files.write(Paths.get("primes.txt"), primes, - StandardOpenOption.CREATE); - } -} diff --git a/src/main/java/com/javaedge/concurrency/streams/Summing.java b/src/main/java/com/javaedge/concurrency/streams/Summing.java deleted file mode 100644 index dd4b203..0000000 --- a/src/main/java/com/javaedge/concurrency/streams/Summing.java +++ /dev/null @@ -1,44 +0,0 @@ -package main.java.com.javaedge.concurrency.streams; - -import com.javaedge.concurrency.common.Timer; - -import java.util.function.LongSupplier; -import java.util.stream.LongStream; - -/** - * @author JavaEdge - */ -public class Summing { - static void timeTest(String id, long checkValue, LongSupplier operation) { - System.out.print(id + ": "); - Timer timer = new Timer(); - long result = operation.getAsLong(); - if (result == checkValue) { - System.out.println(timer.duration() + "ms"); - } else { - System.out.format("result: %d%ncheckValue: %d%n", result, checkValue); - } - } - - public static final int SZ = 100_000_000; - /** - * Gauss's formula - */ - public static final long CHECK = (long) SZ * ((long) SZ + 1) / 2; - - public static void main(String[] args) { - System.out.println(CHECK); - timeTest("Sum Stream", CHECK, () -> - LongStream.rangeClosed(0, SZ).sum()); - timeTest("Sum Stream Parallel", CHECK, () -> - LongStream.rangeClosed(0, SZ).parallel().sum()); - timeTest("Sum Iterated", CHECK, () -> - LongStream.iterate(0, i -> i + 1) - .limit(SZ + 1).sum()); - // Slower & runs out of memory above 1_000_000: - // timeTest("Sum Iterated Parallel", CHECK, () -> - // LongStream.iterate(0, i -> i + 1) - // .parallel() - // .limit(SZ+1).sum()); - } -} \ No newline at end of file diff --git a/src/main/java/com/javaedge/concurrency/sync/ObjectSyncDemo1.java b/src/main/java/com/javaedge/concurrency/sync/ObjectSyncDemo1.java deleted file mode 100755 index ad2aa6d..0000000 --- a/src/main/java/com/javaedge/concurrency/sync/ObjectSyncDemo1.java +++ /dev/null @@ -1,35 +0,0 @@ -package main.java.com.javaedge.concurrency.sync; - -/** - * 锁 方法(静态/非静态),代码块(对象/类) - * - * @author JavaEdge - * @date 2019/10/20 - */ -public class ObjectSyncDemo1 { - - static Object temp = new Object(); - - // 方法上面:锁的对象 是 类的一个实例 - public void test1() { - // 类锁(class对象,静态方法),实例锁(this,普通方法) - synchronized (this) { - try { - System.out.println(Thread.currentThread() + " 我开始执行"); - Thread.sleep(3000L); - System.out.println(Thread.currentThread() + " 我执行结束"); - } catch (InterruptedException e) { - } - } - } - - public static void main(String[] args) throws InterruptedException { - new Thread(() -> new ObjectSyncDemo1().test1()).start(); - - // 等1秒钟,让前一个线程启动起来 - Thread.sleep(1000L); - new Thread(() -> { - new ObjectSyncDemo1().test1(); - }).start(); - } -} diff --git a/src/main/java/com/javaedge/concurrency/sync/ObjectSyncDemo2.java b/src/main/java/com/javaedge/concurrency/sync/ObjectSyncDemo2.java deleted file mode 100755 index 538bbd8..0000000 --- a/src/main/java/com/javaedge/concurrency/sync/ObjectSyncDemo2.java +++ /dev/null @@ -1,18 +0,0 @@ -package main.java.com.javaedge.concurrency.sync; - -// 可重入 -public class ObjectSyncDemo2 { - - public synchronized void test1(Object arg) { - // 继续执行,保证能读取到之前的修改 JMM - System.out.println(Thread.currentThread() + " 我开始执行 " + arg); - if (arg == null) { - test1(new Object()); - } - System.out.println(Thread.currentThread() + " 我执行结束" + arg); - } - - public static void main(String[] args) throws InterruptedException { - new ObjectSyncDemo2().test1(null); - } -} diff --git a/src/main/java/com/javaedge/concurrency/sync/ObjectSyncDemo3.java b/src/main/java/com/javaedge/concurrency/sync/ObjectSyncDemo3.java deleted file mode 100755 index 7ddcd91..0000000 --- a/src/main/java/com/javaedge/concurrency/sync/ObjectSyncDemo3.java +++ /dev/null @@ -1,22 +0,0 @@ -package main.java.com.javaedge.concurrency.sync; - -// 锁粗化(运行时 jit 编译优化) -// jit 编译后的汇编内容, jitwatch可视化工具进行查看 -public class ObjectSyncDemo3 { - int i; - - public void test1(Object arg) { - synchronized (this) { - i++; - // } - // synchronized (this) { - i++; - } - } - - public static void main(String[] args) throws InterruptedException { - for (int i = 0; i < 10000000; i++) { - new ObjectSyncDemo3().test1("a"); - } - } -} diff --git a/src/main/java/com/javaedge/concurrency/sync/ObjectSyncDemo4.java b/src/main/java/com/javaedge/concurrency/sync/ObjectSyncDemo4.java deleted file mode 100755 index 82eb858..0000000 --- a/src/main/java/com/javaedge/concurrency/sync/ObjectSyncDemo4.java +++ /dev/null @@ -1,33 +0,0 @@ -package main.java.com.javaedge.concurrency.sync; - -// 锁消除(jit) -public class ObjectSyncDemo4 { - public void test3(Object arg) { - StringBuilder builder = new StringBuilder(); - builder.append("a"); - builder.append(arg); - builder.append("c"); - System.out.println(arg.toString()); - } - - public void test2(Object arg) { - String a = "a"; - String c = "c"; - System.out.println(a + arg + c); - } - - public void test1(Object arg) { - // jit 优化, 消除了锁 (Buffer 实例 局部变量) - StringBuffer stringBuffer = new StringBuffer(); - stringBuffer.append("a"); - stringBuffer.append(arg); - stringBuffer.append("c"); - // System.out.println(stringBuffer.toString()); - } - - public static void main(String[] args) throws InterruptedException { - for (int i = 0; i < 1000000; i++) { - new ObjectSyncDemo4().test1("123"); - } - } -} diff --git a/src/main/java/com/javaedge/concurrency/threadLocal/DirtyDataInThreadLocal.java b/src/main/java/com/javaedge/concurrency/threadLocal/DirtyDataInThreadLocal.java deleted file mode 100644 index ea21286..0000000 --- a/src/main/java/com/javaedge/concurrency/threadLocal/DirtyDataInThreadLocal.java +++ /dev/null @@ -1,35 +0,0 @@ -package main.java.com.javaedge.concurrency.threadLocal; - -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; - -/** - * @author JavaEdge - * @date 2022/10/4 - */ -public class DirtyDataInThreadLocal { - - public static ThreadLocal threadLocal = new ThreadLocal<>(); - - public static void main(String[] args) { - ExecutorService threadPool = Executors.newFixedThreadPool(1); - for (int i = 0; i < 2; i++) { - MyThread myThread = new MyThread(); - threadPool.execute(myThread); - } - } - - private static class MyThread extends Thread { - - private static boolean flag = true; - - @Override - public void run() { - if (flag) { - threadLocal.set(this.getName() + ", session info."); - flag = false; - } - System.out.println(this.getName() + " 线程是 " + threadLocal.get()); - } - } -} diff --git a/src/main/java/com/javaedge/concurrency/threadpermessage/EchoServer.java b/src/main/java/com/javaedge/concurrency/threadpermessage/EchoServer.java deleted file mode 100644 index 706a074..0000000 --- a/src/main/java/com/javaedge/concurrency/threadpermessage/EchoServer.java +++ /dev/null @@ -1,52 +0,0 @@ -package main.java.com.javaedge.concurrency.threadpermessage; - -import java.io.IOException; -import java.io.UncheckedIOException; -import java.net.InetSocketAddress; -import java.nio.ByteBuffer; -import java.nio.channels.ServerSocketChannel; -import java.nio.channels.SocketChannel; - -/** - * 回显从客户端收到的数据 - * - * @author JavaEdge - */ -public final class EchoServer { - - public static void main(String[] args) throws Exception { - final ServerSocketChannel ssc = ServerSocketChannel.open().bind( - new InetSocketAddress(8080)); - // 处理请求 - try { - while (true) { - // 接收请求 - SocketChannel sc = ssc.accept(); - // 每个请求都创建一个线程 - new Thread(() -> { - try { - // 读Socket - ByteBuffer rb = ByteBuffer.allocateDirect(1024); - sc.read(rb); - //模拟处理请求 - try { - Thread.sleep(2000); - } catch (InterruptedException e) { - e.printStackTrace(); - } - // 写Socket - ByteBuffer wb = (ByteBuffer) rb.flip(); - sc.write(wb); - // 关闭Socket - sc.close(); - } catch (IOException e) { - throw new UncheckedIOException(e); - } - }).start(); - } - } finally { - ssc.close(); - } - } -} - diff --git a/src/main/java/com/javaedge/concurrency/threadpool/MyThreadPool.java b/src/main/java/com/javaedge/concurrency/threadpool/MyThreadPool.java deleted file mode 100644 index c691a43..0000000 --- a/src/main/java/com/javaedge/concurrency/threadpool/MyThreadPool.java +++ /dev/null @@ -1,70 +0,0 @@ -package main.java.com.javaedge.concurrency.threadpool; - -import com.google.common.collect.Lists; -import lombok.SneakyThrows; - -import java.util.List; -import java.util.concurrent.BlockingQueue; -import java.util.concurrent.LinkedBlockingQueue; - -/** - * 简化线程池 - * - * @author JavaEdge - * @date 2021/5/16 - */ -public class MyThreadPool { - - /** - * 利用阻塞队列实现生产者-消费者模式 - */ - BlockingQueue workQueue; - - /** - * 保存内部工作线程 - */ - List threads = Lists.newArrayList(); - - MyThreadPool(int poolSize, BlockingQueue workQueue) { - this.workQueue = workQueue; - // 创建工作线程 - for (int idx = 0; idx < poolSize; idx++) { - WorkerThread work = new WorkerThread(); - work.start(); - threads.add(work); - } - } - - /** - * 提交任务 - */ - void execute(Runnable command) throws InterruptedException { - // 将任务加入到workQueue - workQueue.put(command); - } - - /** - * 工作线程:负责消费任务,并执行任务 - */ - class WorkerThread extends Thread { - - @SneakyThrows - @Override - public void run() { - // 消费workQueue中的任务并执行 - while (true) { - Runnable task = workQueue.take(); - task.run(); - } - } - } - - public static void main(String[] args) throws InterruptedException { - // 创建有界阻塞队列 - BlockingQueue workQueue = new LinkedBlockingQueue<>(2); - // 创建线程池 - MyThreadPool pool = new MyThreadPool(10, workQueue); - // 提交任务 - pool.execute(() -> System.out.println("hello")); - } -} \ No newline at end of file diff --git a/src/main/java/com/javaedge/concurrency/threadpool/ThreadPool2.java b/src/main/java/com/javaedge/concurrency/threadpool/ThreadPool2.java deleted file mode 100644 index b11477c..0000000 --- a/src/main/java/com/javaedge/concurrency/threadpool/ThreadPool2.java +++ /dev/null @@ -1,50 +0,0 @@ -package main.java.com.javaedge.concurrency.threadpool; - -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; - -/** - * @author JavaEdge - */ -public class ThreadPool2 { - - public static void main(String[] args) throws InterruptedException { - // P1、P2阶段共用的线程池 - ExecutorService executorService = Executors.newFixedThreadPool(2); - // P1阶段的闭锁 - CountDownLatch p1 = new CountDownLatch(2); - for (int i = 0; i < 2; i++) { - System.out.println("P1"); - //执行P1阶段任务 - executorService.execute(() -> { - // P2阶段的闭锁 - CountDownLatch p2 = new CountDownLatch(2); - // 执行P2阶段子任务 - for (int j = 0; j < 2; j++) { - executorService.execute(() -> { - System.out.println("P2"); - p2.countDown(); - }); - } - - try { - - /** - * 等待P2阶段任务执行完 - * 线程池里所有的线程都在等待P2阶段任务执行完 - * P2阶段任务何时能执行完? - * 永远都无法执行完!因为线程池里的线程都被阻塞了,没有空闲线程执行P2阶段任务。 - */ - p2.await(); - } catch (InterruptedException e) { - e.printStackTrace(); - } - p1.countDown(); - }); - } - // 等着P1阶段任务执行完 - p1.await(); - System.out.println("end"); - } -} \ No newline at end of file diff --git a/src/main/java/workerthread/v1/Channel.java b/src/main/java/workerthread/v1/Channel.java deleted file mode 100644 index 1b2a201..0000000 --- a/src/main/java/workerthread/v1/Channel.java +++ /dev/null @@ -1,87 +0,0 @@ -package main.java.workerthread.v1; - -/** - * 传递工作请求及保存工作线程 - * - * @author JavaEdge - */ -public class Channel { - private static final int MAX_REQUEST = 100; - - /** - * 请求的队列 - */ - private final Request[] requestQueue; - - /** - * 下次 putReq 的位置 - */ - private int tail; - - /** - * 下次 takeReq 的位置 - */ - private int head; - - /** - * Req 的数量 - */ - private int count; - - private final WorkerThread[] threadPool; - - public Channel(int threads) { - this.requestQueue = new Request[MAX_REQUEST]; - this.head = 0; - this.tail = 0; - this.count = 0; - - threadPool = new WorkerThread[threads]; - for (int i = 0; i < threadPool.length; i++) { - threadPool[i] = new WorkerThread("Worker-" + i, this); - } - } - - public void startWorkers() { - for (int i = 0; i < threadPool.length; i++) { - threadPool[i].start(); - } - } - - /** - * 将请求放入队列 - * - * @param request - */ - public synchronized void putRequest(Request request) { - while (count >= requestQueue.length) { - try { - wait(); - } catch (InterruptedException e) { - } - } - requestQueue[tail] = request; - tail = (tail + 1) % requestQueue.length; - count++; - notifyAll(); - } - - /** - * 取出队列中的请求 - * - * @return - */ - public synchronized Request takeRequest() { - while (count <= 0) { - try { - wait(); - } catch (InterruptedException e) { - } - } - Request request = requestQueue[head]; - head = (head + 1) % requestQueue.length; - count--; - notifyAll(); - return request; - } -} diff --git a/src/main/java/workerthread/v1/ClientThread.java b/src/main/java/workerthread/v1/ClientThread.java deleted file mode 100644 index 0a777eb..0000000 --- a/src/main/java/workerthread/v1/ClientThread.java +++ /dev/null @@ -1,33 +0,0 @@ -package main.java.workerthread.v1; - -import java.util.Random; - -/** - * 发送工作请求 - * - * @author JavaEdge - */ -public class ClientThread extends Thread { - private final Channel channel; - - private static final Random random = new Random(); - - public ClientThread(String name, Channel channel) { - super(name); - this.channel = channel; - } - - @Override - public void run() { - for (int i = 0; true; i++) { - // 创建请求实例 - Request request = new Request(getName(), i); - channel.putRequest(request); - try { - Thread.sleep(random.nextInt(1000)); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - } -} diff --git a/src/main/java/workerthread/v1/Main.java b/src/main/java/workerthread/v1/Main.java deleted file mode 100644 index ddb2b83..0000000 --- a/src/main/java/workerthread/v1/Main.java +++ /dev/null @@ -1,22 +0,0 @@ -package main.java.workerthread.v1; - - -/** - * @author JavaEdge - */ -public class Main { - public static void main(String[] args) { - // 工作线程的个数 - Channel channel = new Channel(5); - channel.startWorkers(); - new ClientThread("Alice", channel).start(); - new ClientThread("Bobby", channel).start(); - new ClientThread("Chris", channel).start(); - - try { - Thread.sleep(30000); - } catch (InterruptedException e) { - } - System.exit(0); - } -} diff --git a/src/main/java/workerthread/v1/Request.java b/src/main/java/workerthread/v1/Request.java deleted file mode 100644 index fe85839..0000000 --- a/src/main/java/workerthread/v1/Request.java +++ /dev/null @@ -1,36 +0,0 @@ -package main.java.workerthread.v1; - -/** - * 工作请求 - * - * @author JavaEdge - */ -public class Request { - - /** - * 发送请求的委托人的名字 - */ - private final String name; - - /** - * 请求的编号 - */ - private final int number; - - public Request(String name, int number) { - this.name = name; - this.number = number; - } - - /** - * 处理请求 - */ - public void execute() { - System.out.println(Thread.currentThread().getName() + " executes " + this); - } - - @Override - public String toString() { - return "[ Request from " + name + " No." + number + " ]"; - } -} diff --git a/src/main/java/workerthread/v1/WorkerThread.java b/src/main/java/workerthread/v1/WorkerThread.java deleted file mode 100644 index b6fd422..0000000 --- a/src/main/java/workerthread/v1/WorkerThread.java +++ /dev/null @@ -1,26 +0,0 @@ -package main.java.workerthread.v1; - -/** - * 工作线程 - * - * @author JavaEdge - */ -public class WorkerThread extends Thread { - - private final Channel channel; - - public WorkerThread(String name, Channel channel) { - super(name); - this.channel = channel; - } - - @Override - public void run() { - while (true) { - // 获得一个 Req 实例 - Request request = channel.takeRequest(); - // 执行之 - request.execute(); - } - } -} diff --git a/src/main/java/workerthread/v2/Channel.java b/src/main/java/workerthread/v2/Channel.java deleted file mode 100644 index e28e807..0000000 --- a/src/main/java/workerthread/v2/Channel.java +++ /dev/null @@ -1,19 +0,0 @@ -package main.java.workerthread.v2; - -import workerthread.v1.Request; - -public final class Channel { - public Channel(int threads) { - } - - public void startWorkers() { - } - - public void putRequest(final Request request) { - new Thread() { - public void run() { - request.execute(); - } - }.start(); - } -} diff --git a/src/main/main.iml b/src/main/main.iml deleted file mode 100644 index 6e2ebbf..0000000 --- a/src/main/main.iml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/test/test.iml b/src/test/test.iml deleted file mode 100644 index a0e49a3..0000000 --- a/src/test/test.iml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file