java多线程:
1.并发执行与并行执行:
并行执行通常指同一时刻有多个代码在处理器上执行,这往往需要多个处理器,如cpu等硬件的支持。
并发执行:在单处理器上,同一时刻只能执行一个代码,但在一个时间段内,这些代码交替执行,即所谓的“微观串行,宏观并行”。若机器只有一个cpu运算时间并不会因为采取多线程的方式而减少,但是整体的感觉会比较好(如按钮不会无反应)。
2.线程的创建
有两种分别是:thread线程类与runnable接口。但都用到thread类及其相关方法。
构造函数:
Thread();Thread(String name);Thread(Runnable target);
Thread(Runnable target,String name);
方法:
start();run();join();setpriority();sleep()等;
创建方法一:
class mythread extends Thread
{
public void run()
{
....执行相关代码;
执行到最后一条语句退出。
}
}
调用:
mythread my=new mythread ();
my.start();
创建方法二:
class mythread implements Runnable
{
public void run()
{
....执行相关代码;
执行到最后一条语句退出。
}
}
调用:
mythread my=new mythread();
Thread t=new Thread(my);
t.start();
各自的特点:编写简单,但使用Thread类就不能再继承其他类。使用Runnable接口能实现多继承。
3.数据的共享
mythread my1=new mythread();//mythread继承的是Thread
mythread my2=new mythread();
mythread my3=new mythread();
my1.start();
my2.start();
my3.start();//三个线程分别调用自己的线程,不能实现共享
///
mythread t=new mythread();//mythread继承的是Runnable接口
Thread t1=new Thread(t,"1窗口");
Thread t1=new Thread(t,"2窗口");
Thread t1=new Thread(t,"3窗口");
t1.start();
t2.start();
t3.start();//三个线程调用的是同一个run方法
由以上可知Runnable接口适合处理多线程访问同一资源的情况,并且可以避免由于java的单继承带来的局限。
4.多线程的同步控制
对某个对象或某个方法加上synchronized互斥锁
如
public synchronized 返回类型 方法名()
{
方法体;
}
synchronized的功能是判断对象的互斥锁是否存在,若在就获得互斥锁,然后执行其中的相关代码,若不在,则被其他的线程拿走,就进入等待状态,直到获得互斥锁。synchronized限定的代码段执行完毕就释放互斥锁。
如:
class bank
{
public synchronized take()
{...}
}
class customer extends Thread
{
public void run()
{
for(i<4)
bank.take(100);
}
}
主函数中:
customer c1=new customer();
customer c2=new customer();
c1.start();
c2.start();
执行的结果是:
1900
1800
1700
1600
...
1200
由以上可知实现了对同一资源进行了“原子操作”.
5.线程间的通信
wait(),notify()为线程间的通信提供了有效手段。
对象调用他们两个方法时,必须已经获得该对象的互斥锁,也就是说这两个方法只能在同步代码块里调用。
1.并发执行与并行执行:
并行执行通常指同一时刻有多个代码在处理器上执行,这往往需要多个处理器,如cpu等硬件的支持。
并发执行:在单处理器上,同一时刻只能执行一个代码,但在一个时间段内,这些代码交替执行,即所谓的“微观串行,宏观并行”。若机器只有一个cpu运算时间并不会因为采取多线程的方式而减少,但是整体的感觉会比较好(如按钮不会无反应)。
2.线程的创建
有两种分别是:thread线程类与runnable接口。但都用到thread类及其相关方法。
构造函数:
Thread();Thread(String name);Thread(Runnable target);
Thread(Runnable target,String name);
方法:
start();run();join();setpriority();sleep()等;
创建方法一:
class mythread extends Thread
{
public void run()
{
....执行相关代码;
执行到最后一条语句退出。
}
}
调用:
mythread my=new mythread ();
my.start();
创建方法二:
class mythread implements Runnable
{
public void run()
{
....执行相关代码;
执行到最后一条语句退出。
}
}
调用:
mythread my=new mythread();
Thread t=new Thread(my);
t.start();
各自的特点:编写简单,但使用Thread类就不能再继承其他类。使用Runnable接口能实现多继承。
3.数据的共享
mythread my1=new mythread();//mythread继承的是Thread
mythread my2=new mythread();
mythread my3=new mythread();
my1.start();
my2.start();
my3.start();//三个线程分别调用自己的线程,不能实现共享
///
mythread t=new mythread();//mythread继承的是Runnable接口
Thread t1=new Thread(t,"1窗口");
Thread t1=new Thread(t,"2窗口");
Thread t1=new Thread(t,"3窗口");
t1.start();
t2.start();
t3.start();//三个线程调用的是同一个run方法
由以上可知Runnable接口适合处理多线程访问同一资源的情况,并且可以避免由于java的单继承带来的局限。
4.多线程的同步控制
对某个对象或某个方法加上synchronized互斥锁
如
public synchronized 返回类型 方法名()
{
方法体;
}
synchronized的功能是判断对象的互斥锁是否存在,若在就获得互斥锁,然后执行其中的相关代码,若不在,则被其他的线程拿走,就进入等待状态,直到获得互斥锁。synchronized限定的代码段执行完毕就释放互斥锁。
如:
class bank
{
public synchronized take()
{...}
}
class customer extends Thread
{
public void run()
{
for(i<4)
bank.take(100);
}
}
主函数中:
customer c1=new customer();
customer c2=new customer();
c1.start();
c2.start();
执行的结果是:
1900
1800
1700
1600
...
1200
由以上可知实现了对同一资源进行了“原子操作”.
5.线程间的通信
wait(),notify()为线程间的通信提供了有效手段。
对象调用他们两个方法时,必须已经获得该对象的互斥锁,也就是说这两个方法只能在同步代码块里调用。