多线程在以前自学的时期,只按照教科书上敲过几个程序,对各种函数的功能理解的并不透彻,现在学习了教学视频,对这部分内容有了全新的理解。概念:首先明确其概念线程和进程是有区别的。进程是正在进行中的程序,是一个应用程序在内存中一片内存空间。而线程是指进程中能够独立执行的控制单元,线程控制着进程的执行,一个进程可以同时运行多个不同的线程。创建线程的方式:有两种:继承 Thread 类。或者 实现Runnable 接口,然后构造线程对象,把实现的类的对象作为构造线程的参数。两者都需要重写其中的run()方法,其中定义的是希望线程运行的代码。下面是实现Runnable接口的形式:
class Demo implements Runnable
{
public void run()
{
for(int x=1; x<=20; x++)
{
System.out.println(Thread.currentThread().getName()+"......"+x);
} }}
class ThreadDemo{
public static void main(String[] args) {
Demo d = new Demo(); Thread t1 = new Thread(d);//把d作为参数
构造线程对象 Thread t2 = new Thread(d); t1.start(); t2.start(); }}
多线程实现多个窗口卖票。
*/
class Ticket implements Runnable//extends Thread
{
private int tick = 100;
public void run()
{
while(true)
{
if(tick>0)
{
//显示线程名及余票数
System.out.println(Thread.currentThread().getName()+"....sale : "+ tick--);
}
}
}
}
class TicketDemo
{
public static void main(String[] args)
{
//创建Runnable接口子类的实例对象
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();
}
}
就会出现tick这个共享数据出现错误,此时需要解决安全问题就需要用同步的方法。{
private int tick=100;
Object obj = new Object();
public void run()
{
while(true)
{
//同步代码块
synchronized(obj)
{
if(tick>0)
{
try
{
//使用线程中的sleep方法,模拟线程出现的安全问题
//因为sleep方法有异常声明,所以这里要对其进行处理
Thread.sleep(10);
}
catch (Exception e)
{
}
System.out.println(Thread.currentThread().getName()+"..tick="+tick--);
}
}
}
}
}
第二种是同步函数,只需在需要同步的函数用synchronized修饰即可。同步代码块需要建立一个任意对象作为锁,而同步函数则默认本类对象的引用为锁,就是this。
class Ticket implements Runnable
{
private int tick=100;
Object obj = new Object();
public void run()
{
while(true)
{
show();
}
}
public synchronized void show()//直接在函数上用synchronized修饰即可实现同步
{
if(tick>0)
{
try
{
Thread.sleep(10);
}
catch (Exception e)
{
}
System.out.println(Thread.currentThread().getName()+"..tick="+tick--);
}
}
}
class Lock
{
static Object lock1 = new Object();
static Object lock2 = new Object();
}
class Run implements Runnable
{
private boolean flag ;
Run(boolean flag)
{
this.flag = flag;
}
public void run()
{
if(flag == true)
{
synchronized(Lock.lock1)
{
System.out.println("true lock1");
synchronized(Lock.lock2)
{
System.out.println("true lock2");
}
}
}
else
{
synchronized(Lock.lock2)
{
System.out.println("false lock2");
synchronized(Lock.lock1)
{
System.out.println("false lock1");
}
}
}
}
}
class DeadLockTest
{
public static void main(String[] args)
{
Thread t1 = new Thread(new Run(true));
Thread t2 = new Thread(new Run(false));
t1.start();
t2.start();
}
}
线程间的通信:
class Res//表示资源 就是产品
{
private String name;
private int count = 1;
private boolean flag = false;
public synchronized void set(String name)
{
while(flag){
try{
wait();
}catch(InterruptedException e){
}
}
this.name = name + "--" + count++;
flag = true;
this.notifyAll();//唤醒等待线程
System.out.println(Thread.currentThread().getName() +"--producer" + this.name);
}
public synchronized void out()
{
while(!flag){
try{
wait();
}catch(InterruptedException e){
}
}
flag = false;
this.notifyAll();
System.out.println(Thread.currentThread().getName() +"--consumer--" + this.name);
}
}
class Producer implements Runnable
{
private Res r;
public Producer(Res r)
{
this.r = r;
}
public void run()
{
for(int i = 0; i<100; i++)
{
r.set("--goods-----");//生产产品 set()函数设置属性
}
}
}
class Consumer implements Runnable
{
private Res r;
public Consumer(Res r)
{
this.r = r;
}
public void run()
{
for(int i = 0; i<100; i++)
{
r.out();//输出产品信息,表示消费产品
}
}
}
class ProducerConsumerTest
{
public static void main(String[] args)
{
Res r = new Res();
Producer pro = new Producer(r);
Consumer con = new Consumer(r);
Thread t1 = new Thread(pro);
Thread t2 = new Thread(con);
Thread t3 = new Thread(pro);
Thread t4 = new Thread(con);
t1.start();
t2.start();
t3.start();
t4.start();
}
}
多线程这部分知识十分重要,对多条任务之间协调的思维是一种锻炼,以上。