Java 虚拟机允许应用程序并发地运行多个执行线程main方法是单线程的
创建线程
方法一:
将类声明为 Thread 的子类,该子类应重写 Thread 类的 run 方法,接下来可以分配并启动该子类的实例
继承 - 重写 - 创建对象 - 启动
public class MyThread extends Thread {
@Override
public void run() {
System.out.println(getName() + "\tHelloWorld");
}
}
public class ThreadTest {
public static void main(String[] args) {
//void setName(String name): 改变线程名称,使之与参数 name 相同
//String getName(): 返回该线程的名称
MyThread mt = new MyThread();
mt.setName("线程一");
mt.start();
MyThread mt1 = new MyThread();
mt1.setName("线程二");
mt1.start();
}
方法二:
声明实现 Runnable 接口的类,该类然后实现 run 方法
然后可以分配该类的实例,在创建 Thread 时作为一个参数来传递并启动
public class MyThread2 implements Runnable {
@Override
public void run() {
for (int i = 0; i < 10; ++i) {
//static Thread currentThread() :返回对当前正在执行的线程对象的引用
System.out.println(Thread.currentThread().getName() + "=" + i);
}
}
}
public class ThreadTest2 {
public static void main(String[] args) {
//method();
//这种方法创建的线程可以分别对实现Runnable 接口的类中成员变量赋值
MyThread2 mt = new MyThread2();
//Thread(Runnable target) :分配新的 Thread 对象
Thread t = new Thread(mt);
t.setName("线程一");
t.start();
MyThread2 mt1 = new MyThread2();
Thread t1 = new Thread(mt1);
t1.setName("线程二");
t1.start();
}
private static void method() {
//这种方法创建的线程共享实现Runnable 接口的类中的成员变量的值
MyThread2 mt = new MyThread2();
//Thread(Runnable target) :分配新的 Thread 对象
Thread t = new Thread(mt);
t.setName("线程一");
t.start();
Thread t1 = new Thread(mt);
t1.setName("线程二");
t1.start();
}
}
线程同步
使用关键字synchronized
关键字synchronized可以修饰方法和代码块
synchronized(锁对象){ }
public synchronized void method(){ }
public static synchronized void method(){ }
同步效率低,安全性高
非同步效率高,安全性低
非静态的同步方法的锁对象是this
静态的同步方法的锁对象是当前类的字节码对象