JAVA中创建进程的方式:
package com.anonymous.javase.day06;
import java.io.IOException;
import java.util.List;
/*java操作进程:
在java代码中如何运行一个进程().
方式1:Runtime类中的exec方法;
方式2:ProcessBuilder类中的start方法:
*/
public class Demo1 {
public static void main(String[] args) throws IOException {
//方式1:启动Runtime的exec方法
Runtime runtime = Runtime.getRuntime();
runtime.exec("notepad");
runtime.exec("calc");
//方式2:ProcessBuilder的start
ProcessBuilder builder = new ProcessBuilder("notepad");
builder.start();
}
}
java中创建线程的方式:
创建和启动线程,传统有两种方式: 方式1:继承Tread类; 方式2:实现Runnable接口; 线程类(java.lang.Tread):Tread类和Tread的子类才能称之为线程类, 主线程(main方法是主线程);
package com.anonymous.javase.day06;
//继承和实现两种方式启动线程
//使用Thread方式
public class Demo2 extends Thread {
/**
* 创建和启动线程,传统有两种方式: 方式1:继承Tread类; 方式2:实现Runnable接口;
* 线程类(java.lang.Tread):Tread类和Tread的子类才能称之为线程类, 主线程(main方法是主线程);
*/
@Override
public void run() {
for (int i = 1; i <= 50; i++) {
System.out.println("打游戏!" + i);
}
}
public static void main(String[] args) {
for (int i = 1; i <= 50; i++) {
System.out.println("敲代码!" + i);
if (i == 10) {
Demo2 demo2 = new Demo2();
demo2.start();
}
/**
* 敲代码!1 敲代码!2 敲代码!3 敲代码!4 敲代码!5 敲代码!6 敲代码!7 敲代码!8 敲代码!9 敲代码!10
* 敲代码!11 敲代码!12 敲代码!13 敲代码!14 敲代码!15 敲代码!16 敲代码!17 敲代码!18 敲代码!19
* 敲代码!20 (<这里才开始让线程><>)打游戏!1 敲代码!21 打游戏!2 敲代码!22 打游戏!3 敲代码!23 打游戏!4 打游戏!5 敲代码!24
* 打游戏!6 打游戏!7 敲代码!25 打游戏!8 打游戏!9 敲代码!26 打游戏!10 敲代码!27 打游戏!11 敲代码!28
* 敲代码!29 打游戏!12 敲代码!30 打游戏!13 敲代码!31 打游戏!14 敲代码!32 打游戏!15 敲代码!33
* 打游戏!16 敲代码!34 打游戏!17 敲代码!35 敲代码!36 打游戏!18 敲代码!37 敲代码!38 打游戏!19
* 敲代码!39 打游戏!20 敲代码!40 打游戏!21 敲代码!41 打游戏!22 打游戏!23 打游戏!24 打游戏!25
* 打游戏!26 打游戏!27 打游戏!28 敲代码!42 打游戏!29 敲代码!43 打游戏!30 敲代码!44 打游戏!31
* 敲代码!45 打游戏!32 敲代码!46 打游戏!33 敲代码!47 打游戏!34 敲代码!48 打游戏!35 敲代码!49
* 打游戏!36 敲代码!50 打游戏!37 打游戏!38 打游戏!39 打游戏!40 打游戏!41 打游戏!42 打游戏!43
* 打游戏!44 打游戏!45 打游戏!46 打游戏!47 打游戏!48 打游戏!49 打游戏!50
*/
}
}
}
package com.anonymous.javase.day06;
//使用Runnable
class Demo3 implements Runnable {
@Override
public void run() {
for (int i = 1; i <= 50; i++) {
System.out.println("运行中..." + i);
}
}
public static void main(String[] args) {
for (int i = 1; i <= 50; i++) {
System.out.println("运行的方式..." + i);
if (i == 20) {
Runnable demo3 = new Demo3();
Thread thread = new Thread(demo3);
thread.start();
}
/**
* 运行的方式...1 运行的方式...2 运行的方式...3 运行的方式...4 运行的方式...5 运行的方式...6
* 运行的方式...7 运行的方式...8 运行的方式...9 运行的方式...10 运行的方式...11 运行的方式...12
* 运行的方式...13 运行的方式...14 运行的方式...15 运行的方式...16 运行的方式...17 运行的方式...18
* 运行的方式...19 运行的方式...20 运行的方式...21 运行的方式...22 运行的方式...23 运行的方式...24
* 运行的方式...25 <到25的时候才让出线程><>运行中...1 运行的方式...26 运行中...2 运行的方式...27 运行中...3
* 运行的方式...28 运行中...4 运行的方式...29 运行中...5 运行的方式...30 运行中...6
* 运行的方式...31 运行中...7 运行的方式...32 运行中...8 运行的方式...33 运行中...9
* 运行的方式...34 运行中...10 运行的方式...35 运行中...11 运行的方式...36 运行中...12
* 运行的方式...37 运行中...13 运行的方式...38 运行中...14 运行的方式...39 运行中...15
* 运行的方式...40 运行中...16 运行的方式...41 运行中...17 运行的方式...42 运行中...18
* 运行的方式...43 运行中...19 运行的方式...44 运行中...20 运行的方式...45 运行中...21
* 运行的方式...46 运行中...22 运行的方式...47 运行中...23 运行的方式...48 运行中...24
* 运行的方式...49 运行中...25 运行的方式...50 运行中...26 运行中...27 运行中...28
* 运行中...29 运行中...30 运行中...31 运行中...32 运行中...33 运行中...34 运行中...35
* 运行中...36 运行中...37 运行中...38 运行中...39 运行中...40 运行中...41 运行中...42
* 运行中...43 运行中...44 运行中...45 运行中...46 运行中...47 运行中...48 运行中...49
* 运行中...50
*/
}
}
}
package com.anonymous.javase.day06;
public class Demo5 implements Runnable {
private int apple = 50;
public static void main(String[] args) {
Demo5 demo5 = new Demo5();
new Thread(demo5, "小明").start();
new Thread(demo5, "名").start();
new Thread(demo5, "红").start();
}
@Override
public void run() {
for (int j = 50; j >= 0; j--) {
if (apple > 0) {
System.out.println(Thread.currentThread().getName() + "吃了"
+ apple + "苹果");
apple--;
}
/**
* 名吃了50苹果 红吃了50苹果 小明吃了50苹果 红吃了48苹果 名吃了49苹果 红吃了46苹果 红吃了44苹果 红吃了43苹果
* 小明吃了47苹果 小明吃了41苹果 小明吃了40苹果 小明吃了39苹果 小明吃了38苹果 小明吃了37苹果 小明吃了36苹果
* 小明吃了35苹果 小明吃了34苹果 小明吃了33苹果 小明吃了32苹果 小明吃了31苹果 小明吃了30苹果 小明吃了29苹果
* 小明吃了28苹果 红吃了42苹果 红吃了26苹果 名吃了45苹果 红吃了25苹果 小明吃了27苹果 红吃了23苹果 名吃了24苹果
* 红吃了21苹果 小明吃了22苹果 红吃了19苹果 名吃了20苹果 红吃了17苹果 小明吃了18苹果 红吃了15苹果 名吃了16苹果
* 红吃了13苹果 小明吃了14苹果 红吃了11苹果 名吃了12苹果 红吃了9苹果 小明吃了10苹果 小明吃了6苹果 小明吃了5苹果
* 小明吃了4苹果 小明吃了3苹果 红吃了7苹果 红吃了1苹果 名吃了8苹果 小明吃了2苹果
*/
}
}
}
使用Thread.sleep(10).模拟网络延迟
package com.anonymous.javase.day06;
public class Demo5 implements Runnable {
private int apple = 50;
public static void main(String[] args) {
Demo5 demo5 = new Demo5();
new Thread(demo5,"小明").start();
new Thread(demo5,"名").start();
new Thread(demo5,"红").start();
}
@Override
public void run() {
for (int j = 50; j >=0; j--) {
if (apple>0) {
try{
Thread.sleep(10);
}catch(Exception e){
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"吃了"+apple+"苹果");
apple--;
}
}
}
}
解决方案:有三种方式:
package com.anonymous.javase.day06;
public class Demo5 implements Runnable {
private int apple = 50;
public static void main(String[] args) {
Demo5 demo5 = new Demo5();
new Thread(demo5,"小明").start();
new Thread(demo5,"名").start();
new Thread(demo5,"红").start();
}
@Override
public void run() {
for (int j = 50; j >=0; j--) {
synchronized (this) {//加上synchronized代码块
if (apple>0) {
try{
Thread.sleep(10);
}catch(Exception e){
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"吃了"+apple+"苹果");
apple--;
}
}
}
}
}
使用synchronized同步方法
package com.anonymous.javase.day06;
public class Demo5 implements Runnable {
private int apple = 50;
public static void main(String[] args) {
Demo5 demo5 = new Demo5();
new Thread(demo5,"小明").start();
new Thread(demo5,"名").start();
new Thread(demo5,"红").start();
}
@Override
public void run() {
for (int j = 50; j >=0; j--) {
eat();
}
}
//使用synchronized同步方法
synchronized private void eat(){
if (apple>0) {
try{
Thread.sleep(10);
}catch(Exception e){
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"吃了"+apple+"苹果");
apple--;}}}
//Thread.currentThread().getName();获取当前线程的名称
使用同步锁机制:
package com.anonymous.javase.day06;
import java.util.concurrent.locks.ReentrantLock;
public class Demo5 implements Runnable {
private final ReentrantLock lock = new ReentrantLock();
private int apple = 50;
public static void main(String[] args) {
Demo5 demo5 = new Demo5();
new Thread(demo5,"小明").start();
new Thread(demo5,"名").start();
new Thread(demo5,"红").start();
}
@Override
public void run() {
for (int j = 50; j >=0; j--) {
eat();
}
}
//同步锁:(Lock)
//Lock机制提供了比synchronized代码块和synchronized方法更广泛的确定性操作,
//同步代码块/同步方法具有的功能都有,除此之外更加强大,更体现面对对象
private void eat(){
lock.lock();//获取锁
if (apple>0) {
try{
Thread.sleep(10);
System.out.println(Thread.currentThread().getName()+"吃了"+apple+"苹果");
apple--;
}catch(Exception e){
e.printStackTrace();
}finally{
lock.unlock();//释放锁
}
}
}
}
package com.anonymous.javase.day06;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
//生产者
class ProducerTest implements Runnable {
private ShareDemo6 share = new ShareDemo6();
public ProducerTest(ShareDemo6 share){
this.share = share;
}
@Override
public void run() {
for (int i = 1; i <= 50 ; i++) {
if (i % 2 == 0) {
share.setArgs("JACK", "男");
}else{
share.setArgs("ROSE", "女");
}
}
}
}
//消费者
class CustomerTest implements Runnable{
private ShareDemo6 share = new ShareDemo6();
public CustomerTest(ShareDemo6 share){
this.share = share;
}
@Override
public void run(){
for (int i = 1; i <= 50; i++) {
share.pass();
}
}
}
public class ShareDemo6 {
private String name ;
private String gender ;
private boolean stauts = true ;//表示生产者生产数据为空
private Lock lock =new ReentrantLock();
Condition con = lock.newCondition();
//生产者生产数据
public void setArgs(String name,String gender){
lock.lock();
try {
if(!stauts){//
con.await();
}
Thread.sleep(10);
this.name = name;
this.gender = gender;
stauts = false;
con.signal();
} catch (InterruptedException e) {
e.printStackTrace();
}finally{
lock.unlock();
}
}
//消费者消费数据
public void pass(){
lock.lock();
try {
if(stauts){
con.await();
}
Thread.sleep(10);
System.out.println(this.name+"_"+this.gender);
stauts = true;
con.signal();
} catch (InterruptedException e) {
e.printStackTrace();
}finally{
lock.unlock();
}
}
public static void main(String[] args) {
ShareDemo6 share = new ShareDemo6();
new Thread(new ProducerTest(share)).start();
new Thread(new CustomerTest(share)).start();
}
}
package com.anonymous.javase.day06;
public class Demo7 {
//线程睡眠
public static void main(String[] args) {
for (int i = 1; i <= 20; i++) {
try {
Thread.sleep(1000);//毫秒数
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(i);
}
}
}
package com.anonymous.javase.day06;
//联合线程
class JoinThread extends Thread{
public JoinThread(String name){
super(name);
}
@Override
public void run() {
for (int i = 1; i <= 50; i++) {
System.out.println(super.getName()+"join"+i);
}
}
}
public class Demo8 {
/**
* 联合线程:
* 线程的join方法,表示一个线程等待另一个线程完成后才执行,join方法被调用之后,线程对象处于阻塞状态
* @throws InterruptedException
*/
public static void main(String[] args) throws InterruptedException {
JoinThread joinThread = new JoinThread("String");
for (int i = 1; i <= 50; i++) {
System.out.println("main线程"+i);
if(i==5){
joinThread.start();
}
if(i==20){//join()表示强制让出线程运行
joinThread.join();
}
}
}
}
package com.anonymous.javase.day06;
//后台线程
class DeamonTest extends Thread{
@Override
public void run() {
for (int i = 1; i <= 500; i++) {
System.out.println("杰克"+i);
}
}
}
public class Demo9 {
public static void main(String[] args) {
DeamonTest test = new DeamonTest();
boolean daemon = test.isDaemon();
System.out.println(daemon);
for (int i = 1; i <= 50; i++) {
System.out.println("main线程"+i);
if (i==10) {
test.setDaemon(true);
test.start();
System.out.println(test.isDaemon());
}
}
}
}