您的位置:首页 > 其它

多线程1

2015-08-04 22:06 197 查看
所谓的进程就是正在执行的程序,而线程就是程序中负责执行程序的执行单元。一个进程中可以有多个执行单元,称之为多线程。一个进程中至少要有一个线程。开启多个线程的目的是为了同时执行多部分代码,每一个线程都有自己要执行的内容,这个内容就叫做 线程需要执行的任务。

多线程的好处:解决了多部分任务同时执行的问题。

多线程的弊端:线程太多,回收效率低。

1、创建线程的两种方式:

(1)继承Thread类

①定义一个类,并继承Thread类

②覆盖Thread类中的run()方法

③直接创建Thread类的子类对象,创建线程

④调用start()方法开启线程并调用线程中的run(),执行线程中的任务

class Demo extends Thread
{
Demo(String name){
super(name);
}

public void run(){
for(int x=0; x<10; x++){
System.out.println("x="+x+"...name="+Thread.currentThread().getName());
}
}
}

class  ThreadDemo1
{
public static void main(String[] args)
{
Demo d1 = new Demo("旺财");
Demo d2 = new Demo("xiaoqiang");

d1.start();
d2.start();
System.out.println("over...."+Thread.currentThread().getName());

}
}
(2)实现Runnable接口

①定义类实现Runnable接口

②覆盖Runnable接口中的run()方法,将线程的任务封装到run()方法中

③通过Thread类创建对象,并将Runnable接口的子类对象作为参数传入到Thread类的构造函数中,因为线程的任务都封装在Runnable子类对象的run方法中,所以在线程创建时就要明确执行的任务是哪一个。

④调用线程对象的start方法进行开启线程

class Demo implements Runnable
{
public void run(){
show();
}
void show(){
for(int x=0; x<9; x++){
System.out.println("x="+x+"...name="+Thread.currentThread().getName());
}
}
}
class ThreadDemo2
{
public static void main(String[] args)
{
Demo d = new Demo();
Thread t1 = new Thread(d);
Thread t2 = new Thread(d);

t1.start();
t2.start();
}
}
2、同步代码块和同步方法

当一个线程在执行操作共享数据的多条代码时,其他线程参与了运算,就会导致安全问题的产生。

解决思路:

将操作共享数据的多条线程代码封装起来,当有线程在执行这些数据时,其他线程不可以参与运算,必须要当前线程将代码执行完毕后,其他线程才可以参与运算。在Java中可以用同步代码块或同步方法来解决。

同步代码块的格式:

synchronized(对象)

{

需要被同步的代码

}

同步的好处:解决了线程的安全问题。

同步的弊端:相对降低了效率,因为同步外的线程的都会判断同步锁。

同步的前提:同步中必须有多个线程并使用同一个锁。

同步方法就是用synchronized修饰的函数,同步方法的锁就是this,而同步代码块的锁可以是任意的对象,同步方法可以看做同部代码块的简写格式。静态同步方法的锁是该类所对应的字节码文件,可以用getClass()方法获取,也可以用类名.class表示。

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+"...name="+Thread.currentThread().getName());
}
}

class Cus implements Runnable
{
private Bank b = new Bank();
public void run()
{
for(int x=0; x<3; x++)
{
b.add(100);
}
}
}

class ThreadDemo3
{
public static void main(String[] args)
{
Cus c = new Cus();
Thread t1 = new Thread(c);
Thread t2 = new Thread(c);
t1.start();
t2.start();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: