java编写线程模型代码 java实现线程的三种方式

Java线程模型如何完善相关的数据处理正如前面所提到的,在抢占式模型中线程可以在代码的任何一个部分的中间被打断,除非那是一个原子操作代码块 。原子操作代码块中的代码段一旦开始执行 , 就要在该线程被换出处理器之前执行完毕 。在 Java 编程中,分配一个小于32位的变量空间是一种原子操作,而此外象double和long这两个64位数据类型的分配就不是原子的 。使用锁来正确同步共享资源的访问,就足以保证一个多线程程序在抢占式模型下正确工作 。
而在协作式模型中,是否能保证线程正常放弃处理器 , 不掠夺其他线程的执行时间,则完全取决于程序员 。调用yield()方法能够将当前的线程从处理器中移出到准备就绪队列中 。另一个方法则是调用sleep() 方法 , 使Java线程模型放弃处理器,并且在 sleep 方法中指定的时间间隔内睡眠 。
正如你所想的那样,将这些方法随意放在代码的某个地方,并不能够保证正常工作 。如果线程正拥有一个锁(因为它在一个同步方法或代码块中),则当它调用yield()时不能够释放这个锁 。这就意味着即使这个Java线程模型已经被挂起,等待这个锁释放的其他线程依然不能继续运行 。为了缓解这个问题 , 最好不在同步方法中调用yield方法 。将那些需要同步的代码包在一个同步块中,里面不含有非同步的方法,并且在这些同步代码块之外才调用yield 。
另外一个解决方法则是调用wait()方法 , 使处理器放弃它当前拥有的对象的锁 。如果对象在方法级别上使同步的,这种方法能够很好的工作 。因为它仅仅使用了一个锁 。如果它使用fine-grained锁,则wait() 将无法放弃这些锁 。此外 , 一个因为调用wait()方法而阻塞的线程,只有当其他线程调用notifyAll()时才会被唤醒 。
Java线程模型模型和AWT/Swing
在那些使用Swing 和/或AWT包创建GUI(用户图形界面)的Java程序中,AWT事件句柄在它自己的线程中运行 。开发员必须注意避免将这些GUI线程与较耗时间的计算工作绑在一起 , 因为这些线程必须负责处理用户时间并重绘用户图形界面 。换句话来说,一旦GUI线程处于繁忙 , 整个程序看起来就象无响应状态 。Swing线程通过调用合适方法,通知那些Swing callback(例如 Mouse Listener 和 Action Listener ) 。这种方法意味着listener无论要做多少事情,都应当利用listener callback方法产生其他线程来完成此项工作 。目的便在于让listener callback更快速返回 , 从而允许Swing线程响应其他事件 。
但是如果不是Swing callback产生的变化该怎么办呢?使用一个非Swing线程来修改Swing数据是不安全的 。Swing提供了两个方法来解决这个问题:invokeLater()和invokeAndWait() 。为了修改Swing状态,只要简单地调用其中一个方法 , 让Runnable的对象来做这些工作 。因为Runnable对象通常就是它们自身的线程,你可能会认为这些对象会作为线程来执行 。但那样做其实也是不安全的 。事实上,Swing会将这些对象放到队列中,并在将来某个时刻执行它的run方法 。这样才能够安全修改Swing状态 。
Java 语言的设计,使得多线程对几乎所有的Applet都是必要的 。特别是,IO和GUI编程都需要多线程来为用户提供完美的体验 。
java并发(1)线程模型 程序并不能单独运行 , 只有将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程序就称之为进程 。程序和进程的区别就在于:程序是指令的集合,它是进程运行的静态描述文本;进程是程序的一次执行活动 , 属于动态概念
主要归咎于两点. 一个是由实现决定的,一个是由需求决定的.
线程由线程ID,程序计数器(PC)[用于指向内存中的程序指令],寄存器集合[由于存放本地变量和临时变量]和堆栈[用于存放方法指令和方法参数等]组成 。
以 Unix/Linux 的体系架构为例 。
因为操作系统的资源是有限的 , 如果访问资源的操作过多,必然会消耗过多的资源,而且如果不对这些操作加以区分 , 很可能造成资源访问的冲突 。所以,为了减少有限资源的访问和使用冲突,对不同的操作赋予不同的执行等级(有多大能力做多大的事),用户态(User Mode)和内核态(Kernel Mode) 。
运行于用户态的进程可以执行的操作和访问的资源都会受到极大的限制 , 而运行在内核态的进程则可以执行任何操作并且在资源的使用上没有限制 。
并发 :一个时间段内有很多的线程或进程在执行,但何时间点上都只有一个在执行,多个线程或进程争抢时间片轮流执行 。
并行 :一个时间段和时间点上都有多个线程或进程在执行 。
线程有三种模型, 一对一,多对一,多对多.具体参考一篇文章读懂Java多线程模型 , 这里只描述一对一的情况.
每个用户线程都映射到一个内核线程 , 每个线程都成为一个独立的调度单元,由内核调度器独立调度 , 一个线程的阻塞不会影响到其他线程 , 从而保障整个进程继续工作.
JVM 没有限定 Java 线程需要使用哪种线程模型来实现,JVM 只是封装了底层操作系统的差异,而不同的操作系统可能使用不同的线程模型,例如 Linux 和 windows 可能使用了一对一模型,solaris 和 unix 某些版本可能使用多对多模型 。所以一谈到 Java 语言的多线程模型,需要针对具体 JVM 实现 。
Sun JDK 1.2开始 , 线程模型都是基于操作系统原生线程模型来实现 , 它的 Window 版和 Linux 版都是使用系统的 1:1 的线程模型实现的 。
java线程模型中的代码和数据各是指什么?就是代码和数据啊
用程序控制线程 程序就是代码
重点放在CPU上是 因为 CPU执行线程 与堆内存密切 线程等待和异步同步执行都是需要掌握的 加上线程锁的问题 CPU处理机制就难以理解了
编写java通过runnable接口创建三个线程同时在创建线程时初始化线程名?示例代码如下:
public class MultiThread {
public static void main(String[] args) {
Thread thread1 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Thread1 running...");
}
}, "Thread1");
Thread thread2 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Thread2 running...");
}
}, "Thread2");
Thread thread3 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Thread3 running...");
}
}, "Thread3");
thread1.start();
thread2.start();
thread3.start();
}
}
运行上述代码 , 将创建三个名为Thread1 , Thread2 , Thread3的线程 。
java线程的经典代码package threadgroup;
class ThreadDemo3 extends Thread {
private String name;
private int delay;
public ThreadDemo3(String sname, int i_delay) {
name = sname;
delay = i_delay;
}
public void run() {
try {
sleep(delay);
} catch (InterruptedException e) {
}
System.out.println("多线程测试!\n"name"\n"delay);
}
}
public class testMyThread {
public static void main(String[] args) {
ThreadDemo3 th1,th2,th3;
th1 = new ThreadDemo3("线程1", (int) (Math.random() * 900));
th2 = new ThreadDemo3("线程2", (int) (Math.random() * 900));
th3 = new ThreadDemo3("线程3", (int) (Math.random() * 900));
th1.start();
th2.start();
th3.start();
}
}
package threadgroup;
public class threadDemo {
public static void main(String[] args) {
Thread t = Thread.currentThread();
t.setName("你好吗?");
System.out.println("正在进行的Thread是:"t);
try {
for (int i = 0; i5; i) {
System.out.println("我不叫穆继超"i);
Thread.sleep(3000);
}
} catch (Exception e) {
// TODO: handle exception
System.out.println("Thread has wrong"e.getMessage());
}
}
}
package threadgroup;
public class threadDemo2 implements Runnable {
public threadDemo2() {
Thread t1 = Thread.currentThread();
t1.setName("第一个主进程");
System.out.println("正在运行"t1);
Thread t2 = new Thread(this, "");
System.out.println("在创建一个进程");
t2.start();
try {
System.out.println("使他进入第一个睡眠状态");
Thread.sleep(2000);
} catch (InterruptedException e) {
System.out.println("Thread has wrong"e.getMessage());
}
System.out.println("退出第一个进程");
}
public void run() {
try {
for (int i = 0; i5; i) {
System.out.println("进程"i);
Thread.sleep(3000);
}
} catch (InterruptedException e) {
// TODO: handle exception
System.out.println("Thread has wrong"e.getMessage());
}
System.out.println("退出第二个进程");
}
public static void main(String[] args) {
new threadDemo2();
}
}
java如何模拟一个多线程环境import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
public class FrameTest extends JFrame {
public FrameTest() {
super("Swing 例子");
this.setSize(300, 200);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLayout(new FlowLayout());
this.add(new CounterJButton());
this.add(new CounterJButton());
this.add(new CounterJButton());
this.setVisible(true);
}
static class CounterJButton extends JButton implements Runnable,
ActionListener {
private boolean started = false;
private intcount = 0;
public CounterJButton() {
super("按我开始计数");
this.addActionListener(this);
}
public void run() {
while (started) {
this.setText("按我暂停"String.valueOf(count));
try {
Thread.sleep(100);
} catch (InterruptedException e) {
}
}
}
public void actionPerformed(ActionEvent e) {
if (started) {
this.started = false;
this.setText("按我恢复计数"count);
} else {
this.started = true;
new Thread(this).start();
}
}
}
public static void main(String[] args) {
new FrameTest();
}
}
【java编写线程模型代码 java实现线程的三种方式】关于java编写线程模型代码和java实现线程的三种方式的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。

    推荐阅读