实例一
public class Demo extends Thread {
private String name;
Demo(String name) {
this.name = name;
}
public void run() {
for (int x = 0; x < 10; x++) {
System.out.println(name + "...x=" + x + "...name=" + Thread.currentThread().getName());
}
}
}
public class ThreadDemo {
public static void main(String[] args) {
Demo d1 = new Demo("小明");
Demo d2 = new Demo("小红");
d1.start();// 开启线程,调用run方法
d2.start();
System.out.println("over" + Thread.currentThread().getName());
}
}
线程的状态
public class Demo implements Runnable {
public void run() {
show();
}
public void show() {
for (int x = 0; x < 10; x++) {
System.out.println("...x=" + x + "...name=" + Thread.currentThread().getName());
}
}
}
public class ThreadDemo2 {
public static void main(String[] args) {
Demo d = new Demo();
Thread t = new Thread(d);
t.start();// 开启线程,调用run方法
System.out.println("over" + Thread.currentThread().getName());
}
}
第二种方式的好处:
##实例
//实例:卖票
public class Ticket extends Thread {
public int num = 100;//当分析对象中所具备的成员变量的值都是相同的,这是这个成员变量就可以被静态修饰
//被static修饰的成员被所有对象共享
public void run() {
while (true) {
if (num > 0) {
System.out.println(Thread.currentThread()+"..."+num--);
}
}
}
}
public class TicketDemo {
public static void main(String[] args) {
Ticket t1 = new Ticket();
Ticket t2 = new Ticket();
Ticket t3 = new Ticket();
Ticket t4 = new Ticket();
t1.start();
t2.start();
t3.start();
t4.start();
}
}
第二种:
public class Ticket implements Runnable {
private int num = 100;//当分析对象中所具备的成员变量的值都是相同的,这是这个成员变量就可以被静态修饰
//被static修饰的成员被所有对象共享
public void run() {
while (true) {
if (num > 0) {
System.out.println(Thread.currentThread() + "..." + num--);
}
}
}
}
public class TicketDemo {
public static void main(String[] args) {
Ticket t = new Ticket();
Thread t1 = new Thread(t);
Thread t2 = new Thread(t);
Thread t3 = new Thread(t);
Thread t4 = new Thread(t);
t1.start();
t2.start();
t3.start();
t4.start();
}
}
线程安全问题
- 1.同步代码块
public class Ticket implements Runnable {
private int num = 100;//当分析对象中所具备的成员变量的值都是相同的,这是这个成员变量就可以被静态修饰
//被static修饰的成员被所有对象共享
Object obj = new Object();
public void run() {
while (true) {
synchronized (obj) {
if (num > 0) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
}
System.out.println(Thread.currentThread() + "..." + num--);
}
}
}
}
public class TicketDemo {
public static void main(String[] args) {
Ticket t = new Ticket();
Thread t1 = new Thread(t);
Thread t2 = new Thread(t);
Thread t3 = new Thread(t);
Thread t4 = new Thread(t);
t1.start();
t2.start();
t3.start();
t4.start();
}
}
演练:
package com.bank;
public class Bank {
private int sum;
Object obj = new Object();
public void add(int num) {
synchronized (obj) {
sum = sum + num;
try {
Thread.sleep(10);
} catch (InterruptedException e) {
}
System.out.println("sum=" + sum);
}
}
}
public class Cus implements Runnable {
private Bank b = new Bank();
public void run() {
for (int x = 0; x < 3; x++) {
b.add(100);
}
}
}
public class BankDemo {
public static void main(String[] args) {
Cus c = new Cus();
Thread t1 = new Thread(c);
Thread t2 = new Thread(c);
t1.start();
t2.start();
}
}
- 2.同步函数
public class Bank {
private int sum;
public synchronized void add(int num) {//同步函数
sum = sum + num;
try {
Thread.sleep(10);
} catch (InterruptedException e) {
}
System.out.println("sum=" + sum);
}
}
同步函数用的锁是this