介绍
1. 进程是操作系统资源分配的基本单位 而线程是CPU的基本调度单位
2. 一个系统运行后至少有一个进程
3. 一个进程可以包含多个线程 但是至少需要有一个线程 否则这个进程是没有意义的
4. 进程间不能共享数据段地址 但同进程的线程之间可以
线程基本组成部分:
1. CPU时间片: 操作系统( OS) 会为每个线程分配执行时间
2. 运行数据:
堆空间: 存储线程需使用的对象 多个线程可以共享堆中的对象
栈空间: 存储线程需使用的局部变量 每个线程都拥有独立的栈
线程的特点:
1. 线程抢占执行:
效率高
可防止单一线程长时间独占CPU
2. 在单核CPU中, 宏观上同时执行, 微观上顺序执行
创建线程的两个方法
第一个方法:继承Thread类
public class MyThreadOne {
public static void main ( String [ ] args) {
MyThread1 t1 = new MyThread1 ( ) ;
t1. start ( ) ;
for ( int i = 0 ; i < 50 ; i++ ) {
System . out. println ( "ID名" + Thread . currentThread ( ) . getId ( ) + "线程名" + Thread . currentThread ( ) . getName ( ) + ":" + i) ;
}
}
}
class MyThread1 extends Thread {
@Override
public void run ( ) {
for ( int i = 0 ; i < 50 ; i++ ) {
System . out. println ( "子线程:" + i) ;
}
}
}
获取和修改线程名字
public class MyThread2 extends Thread {
public MyThread2 ( ) {
}
public MyThread2 ( String name) {
super ( name) ;
}
@Override
public void run ( ) {
for ( int i = 0 ; i < 50 ; i++ ) {
System . out. println ( "ID名" + this . getId ( ) + "线程名" + this . getName ( ) + ":" + i) ;
}
}
}
MyThread2 t1 = new MyThread2 ( ) ;
t1. setName ( "子线程1" ) ;
t1. start ( ) ;
MyThread2 t2 = new MyThread2 ( ) ;
t1. setName ( "子线程2" ) ;
t2. start ( ) ;
MyThread2 t3 = new MyThread2 ( "子线程3" ) ;
t3. start ( ) ;
for ( int i = 0 ; i < 50 ; i++ ) {
System . out. println ( "ID名" + Thread . currentThread ( ) . getId ( ) + "线程名" + Thread . currentThread ( ) . getName ( ) + ":" + i) ;
}
继承Thread类例题:四个窗口各卖100张票
public class Ticket1 extends Thread {
private int ticket = 100 ;
public Ticket1 ( ) {
}
public Ticket1 ( String name) {
super ( name) ;
}
@Override
public void run ( ) {
while ( ticket > 0 ) {
System . out. println ( this . getName ( ) + " 卖了第" + ticket + "张票" ) ;
ticket-- ;
}
}
}
public static void main ( String [ ] args) {
Ticket1 t1 = new Ticket1 ( "窗口1" ) ;
Ticket1 t2 = new Ticket1 ( "窗口2" ) ;
Ticket1 t3 = new Ticket1 ( "窗口3" ) ;
Ticket1 t4 = new Ticket1 ( "窗口4" ) ;
t1. start ( ) ;
t2. start ( ) ;
t3. start ( ) ;
t4. start ( ) ;
}
第二个方法:实现Runnable接口
public class RunnableUse implements Runnable {
@Override
public void run ( ) {
for ( int i = 0 ; i < 50 ; i++ ) {
System . out. println ( "MyRunnable" + i) ;
}
}
}
RunnableUse run1 = new RunnableUse ( ) ;
Thread thread = new Thread ( run1, "子线程1" ) ;
thread. start ( ) ;
for ( int i = 0 ; i < 50 ; i++ ) {
System . out. println ( "main------" + i) ;
}
匿名内部类实现Runnable
public static void main ( String [ ] args) {
Runnable runnable = new Runnable ( ) {
@Override
public void run ( ) {
for ( int i = 0 ; i < 50 ; i++ ) {
System . out. println ( Thread . currentThread ( ) . getName ( ) + ":" + i) ;
}
}
} ;
Thread thread = new Thread ( runnable, "子线程1" ) ;
thread. start ( ) ;
for ( int i = 0 ; i < 50 ; i++ ) {
System . out. println ( "main-----" + i) ;
}
}
Runnable例题1:四个窗口总共卖一百张票
public class Ticket2 implements Runnable {
private int ticket = 100 ;
@Override
public void run ( ) {
while ( ticket > 0 ) {
System . out. println ( Thread . currentThread ( ) . getName ( ) + " 卖了第" + ticket + "张票" ) ;
ticket-- ;
}
}
}
public static void main ( String [ ] args) {
Ticket2 ticket = new Ticket ( ) ;
Thread w1 = new Thread ( ticket, "窗口1" ) ;
Thread w2 = new Thread ( ticket, "窗口2" ) ;
Thread w3 = new Thread ( ticket, "窗口3" ) ;
Thread w4 = new Thread ( ticket, "窗口4" ) ;
w1. start ( ) ;
w2. start ( ) ;
w3. start ( ) ;
w4. start ( ) ;
}
Runnable例题2:银行卡存取
public class BankCard {
private double money;
public double getMoney ( ) {
return money;
}
public void setMoney ( double money) {
this . money = money;
}
}
public class AddMoney implements Runnable {
private BankCard card;
public AddMoney ( BankCard card) {
this . card = card;
}
@Override
public void run ( ) {
for ( int i = 0 ; i < 10 ; i++ ) {
card. setMoney ( card. getMoney ( ) + 1000 ) ;
System . out. println ( Thread . currentThread ( ) . getName ( ) + "存了1000元 余额是" + card. getMoney ( ) ) ;
}
}
}
public class PopMoney implements Runnable {
private BankCard card;
public PopMoney ( BankCard card) {
this . card = card;
}
@Override
public void run ( ) {
for ( int i = 0 ; i < 10 ; i++ ) {
if ( card. getMoney ( ) >= 1000 ) {
card. setMoney ( card. getMoney ( ) - 1000 ) ;
System . out. println ( Thread . currentThread ( ) . getName ( ) + "取了1000元 余额是" + card. getMoney ( ) ) ;
}
else {
System . out. println ( "银行卡余额不足" ) ;
i-- ;
}
}
}
}
public static void main ( String [ ] args) {
BankCard card = new BankCard ( ) ;
AddMoney add = new AddMoney ( card) ;
PopMoney pop = new PopMoney ( card) ;
Thread a1 = new Thread ( add, "mans" ) ;
Thread p1 = new Thread ( pop, "womans" ) ;
a1. start ( ) ;
p1. start ( ) ;
}
Runnable例题2:银行卡存取匿名内部类实现
public class BankCard {
private double money;
public double getMoney ( ) {
return money;
}
public void setMoney ( double money) {
this . money = money;
}
}
public static void main ( String [ ] args) {
BankCard card = new BankCard ( ) ;
Runnable addmoney = new Runnable ( ) {
@Override
public void run ( ) {
for ( int i = 0 ; i < 10 ; i++ ) {
card. setMoney ( card. getMoney ( ) + 1000 ) ;
System . out. println ( Thread . currentThread ( ) . getName ( ) + "存了1000元 余额是" + card. getMoney ( ) ) ;
}
}
} ;
Runnable popmoney = new Runnable ( ) {
@Override
public void run ( ) {
for ( int i = 0 ; i < 10 ; i++ ) {
if ( card. getMoney ( ) >= 1000 ) {
card. setMoney ( card. getMoney ( ) - 1000 ) ;
System . out. println ( Thread . currentThread ( ) . getName ( ) + "取了1000元 余额是" + card. getMoney ( ) ) ;
}
else {
System . out. println ( "银行卡余额不足" ) ;
i-- ;
}
}
}
} ;
new Thread ( addmoney, "man" ) . start ( ) ;
new Thread ( popmoney, "woman" ) . start ( ) ;
}
第三个方法:实现Callable接口
匿名内部类实现
public static void main ( String [ ] args) throws Exception {
Callable < Integer > callable = new Callable < Integer > ( ) {
private int num = 0 ;
@Override
public Integer call ( ) throws Exception {
for ( int i = 0 ; i < 20 ; i++ ) {
synchronized ( this ) {
num += 1 ;
Thread . sleep ( 100 ) ;
}
}
return num;
}
} ;
FutureTask < Integer > task = new FutureTask < > ( callable) ;
Thread t1 = new Thread ( task) ;
Thread t2 = new Thread ( task) ;
t1. start ( ) ;
t2. start ( ) ;
Integer sum = task. get ( ) ;
System . out. println ( sum) ;
}