进程与线程
使用多线程技术后,可以在同一时间运行更多不同种类的任务。
使用多线程
一个进程在运行时候至少有一个线程,比如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