Java多线程_Java多线程技能(1)

进程与线程

在这里插入图片描述
使用多线程技术后,可以在同一时间运行更多不同种类的任务。
在这里插入图片描述
在这里插入图片描述

使用多线程

一个进程在运行时候至少有一个线程,比如Java中的main函数。

继承自Thread类

在这里插入图片描述
在这里插入图片描述

package multiply.com.test;

public class MyThread extends Thread{
    
    
    @Override
    public void run() {
    
    
        super.run();
        System.out.println("MyThread");
    }
}
package multiply.com.test;

public class Run {
    
    
    public static void main(String[] args) {
    
    
        MyThread myThread = new MyThread();
        myThread.start();
        System.out.println("运行结束!");
    }
}

运行结束!
MyThread
在这里插入图片描述
在这里插入图片描述

package multiply.com.test;

public class MyThread extends Thread{
    
    
	private int i;
	public MyThread(int i)
	{
    
    
		super();
		this.i = i;
	}
    @Override
    public void run() {
    
    
        super.run();
        System.out.println(i);
    }
}
package multiply.com.test;

public class Run {
    
    
    public static void main(String[] args) {
    
    
        MyThread myThread1 = new MyThread(1);
        MyThread myThread2 = new MyThread(2);
        MyThread myThread3  = new MyThread(3);
        MyThread myThread4 = new MyThread(4);
        MyThread myThread5 = new MyThread(5);
        myThread1.start();
        myThread2.start();
        myThread3.start();
        myThread4.start();
        myThread5.start();
    }
}

1
2
5
4
3

实现Runnable接口

在这里插入图片描述

package multiply.com.test;

public class MyRunnable implements Runnable {
    
    
    @Override
    public void run() {
    
    
        System.out.println("运行中");
    }
}
package multiply.com.test;

public class Run {
    
    
    public static void main(String[] args) {
    
    
        Runnable runnable = new MyRunnable();
        Thread thread = new Thread(runnable);
        thread.start();
        System.out.println("运行结束");
    }
}

运行结束
运行中
在这里插入图片描述
在这里插入图片描述

实例变量与线程安全

不共享数据的情况:

package multiply.com.test;

public class MyThread extends Thread {
    
    
    private int count = 3;
    public MyThread(String s)
    {
    
    
    	super();
    	this.setName(s);//设置当前线程的名字
    }

    @Override
    public void run() {
    
    
        super.run();
        while(count>0)
        {
    
    
        	count--;
            System.out.println("由" + Thread.currentThread().getName() + "计算,count=" + count);
        }
    }
}
package multiply.com.test;

public class Run {
    
    
    public static void main(String[] args) {
    
    
        MyThread a = new MyThread("A");
        MyThread b = new MyThread("B");
        MyThread c = new MyThread("C");
        a.start();
        b.start();
        c.start();
    }
}

由C计算,count=2
由C计算,count=1
由A计算,count=2
由B计算,count=2
由A计算,count=1
由C计算,count=0
由A计算,count=0
由B计算,count=1
由B计算,count=0
在这里插入图片描述
共享数据的情况:

package multiply.com.test;

public class MyThread extends Thread {
    
    
    private int count = 5;
    @Override
    public void run() {
    
    
        super.run();
        count--;
        System.out.println("由" + Thread.currentThread().getName() + "计算,count=" + count);
    }
}
package multiply.com.test;

public class Run {
    
    
    public static void main(String[] args) {
    
    
    	MyThread myThread = new MyThread();
        Thread a = new Thread(myThread, "A");
        Thread b = new Thread(myThread, "B");
        Thread c = new Thread(myThread, "C");
        Thread d = new Thread(myThread, "D");
        Thread e = new Thread(myThread, "E");
        a.start();
        b.start();
        c.start();
        d.start();
        e.start();
    }
}

由A计算,count=3
由D计算,count=0
由E计算,count=0
由B计算,count=2
由C计算,count=2
多个线程同时访问,一定会出现非线程安全问题,这里就要用到线程同步,让减一操作连续。

package multiply.com.test;

public class MyThread extends Thread {
    
    
    private int count = 5;
    @Override
    synchronized public void run() {
    
    
        super.run();
        count--;
        System.out.println("由" + Thread.currentThread().getName() + "计算,count=" + count);
    }
}

由A计算,count=4
由D计算,count=3
由C计算,count=2
由E计算,count=1
由B计算,count=0
在这里插入图片描述

留意i–与System.out.println()的异常

package multiply.com.test;

public class MyThread extends Thread {
    
    
    private int count = 5;
    @Override
    synchronized public void run() {
    
    
        super.run();
        System.out.println("由" + Thread.currentThread().getName() + "计算,count=" + count--);
    }
}

在这里插入图片描述

currentThread()方法

package multiply.com.test;

public class MyThread extends Thread {
    
    
	public MyThread()
	{
    
    
		System.out.println("构造方法的打印:"+Thread.currentThread().getName());
		System.out.println("this.getName():"+this.getName());
	}
    @Override
    public void run() {
    
    
        System.out.println("run方法的打印:"+Thread.currentThread().getName());
        System.out.println("this.getName():"+this.getName());
    }
}
package multiply.com.test;

public class Run {
    
    
    public static void main(String[] args) {
    
    
    	MyThread myThread = new MyThread();
    	//myThread.start();
    	myThread.run();
    }
}

构造方法的打印:main
this.getName():Thread-0
run方法的打印:main
this.getName():Thread-0

package multiply.com.test;

public class Run {
    
    
    public static void main(String[] args) {
    
    
    	MyThread myThread = new MyThread();
    	myThread.start();
    	//myThread.run();
    }
}

构造方法的打印:main
this.getName():Thread-0
run方法的打印:Thread-0
this.getName():Thread-0
在这里插入图片描述

おすすめ

転載: blog.csdn.net/qq_42148307/article/details/120724644