一:多线程
(1)概述:在一个线程中有多条执行路径
进程: 正在执行的程序,它代表着应用程序的执行区域.
线程: 进程的执行路径.
(2)创建线程的两种方式
1:继承Thread类,实现run方法
举例:
class MyThread extends Thread
{
public void run()
{
for(int i=0; i<10; i++)
{
System.out.println(getName()+"***"+i);
}
}
}
class ThreadDemo2
{
public static void main(String[] args)
{
MyThread my1 = new MyThread();
MyThread my2 = new MyThread();
my1.start();//调用Thread方法启动线程
my2.start();
for(int i=0; i<10; i++)
{
System.out.println(Thread.currentThread().getName()+"***"+i);
}
}
}
2:实现Runable接口,然后实现run方法
class MyThread implements Runnable
{
public void run()
{
for(int i=0; i<10; i++)
{
//getName()这个是Thread类的.所以在这个类中就不能通过getName()获取线程的名字
//System.out.println(getName()+"***"+i);
//Thread.currentThread()获取当前线程对象的引用
System.out.println(Thread.currentThread().getName()+"***"+i);
}
}
}
class ThreadDemo5
{
public static void main(String[] args)
{
MyThread my = new MyThread();
Thread t1 = new Thread(my);//是用Thread的构造方法启动线程,可以给这个线程传个名字.
Thread t2 = new Thread(my);
t1.start();
t2.start();
}
}
二:同步代码块与同步函数
由于多线程抢占CPU执行权,造成了线程的随机性,所以多线程是不安全的,这里就需要同步代码块与同步函数来解决了.
同步代码块举例:
class Ticket implements Runnable
{
private int tickets = 100;
Object obj = new Object();
Demo d = new Demo();//这里d对象是任意的,主要是创建一个锁给同步代码块使用.
public void run()
{
while(true)
{
//t1,t2,t3,t4 同时进来看哪个线程抢到锁,抢到了锁.别的线程就进不去了.解决了安全问题
synchronized(d) //将产生不安全的代码使用同步代码块.
{
if(tickets>0)
{
try
{
//睡眠100毫秒
Thread.sleep(100);
}
catch (InterruptedException e)
{
}
System.out.println(Thread.currentThread().getName()+"***"+(tickets--));
}
}
}
}
}
class Demo
{
}
class ThreadDemo8
{
public static void main(String[] args)
{
Ticket t = new Ticket();
Thread t1 = new Thread(t,"窗口1");
Thread t2 = new Thread(t,"窗口2");
Thread t3 = new Thread(t,"窗口3");
Thread t4 = new Thread(t,"窗口4");
t1.start();
t2.start();
t3.start();
t4.start();
}
}
同步函数举例:
class Ticket implements Runnable
{
private int tickets = 100;
Object obj = new Object();
public void run()
{
while(true)
{
show();
}
}
public synchronized void show()
{
if(tickets>0)
{
try
{
//睡眠100毫秒
Thread.sleep(100);
}
catch (InterruptedException e)
{
}
System.out.println(Thread.currentThread().getName()+"***"+(tickets--));
}
}
}
class FunctionDemo
{
public static void main(String[] args)
{
Ticket t = new Ticket();
Thread t1 = new Thread(t,"窗口1");
Thread t2 = new Thread(t,"窗口2");
Thread t3 = new Thread(t,"窗口3");
Thread t4 = new Thread(t,"窗口4");
t1.start();
t2.start();
t3.start();
t4.start();
}
}
---------------------- android培训、 java培训、期待与您交流! ----------------------