「java线程数据」java线程数据交互

博主:adminadmin 2022-12-01 11:25:09 77

本篇文章给大家谈谈java线程数据,以及java线程数据交互对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

java中多个线程访问共享数据的方式有哪些

多个线程对共同数据的访问的实现,要根据情况而定 (1)当访问共同的代码的时候:可以使用同一个Runnable对象,这个Runnable对象中有这个共享数据,比如卖票系统就可以这么做。或者这个共享数据封装在一个对象当中,然后对这个对象加锁,也可以实现数据安全访问。 (2)当各个线程访问的代码不同时:这时候要使用不同的Runnable对象,有两种实现方式: a)将共享数据封装在另一个对象当中,然后将这个对象逐一的转递给各个Runnable对象。操作数据的方法也放进这个对象当中。这样容易实现各个线程对这个数据的同步和共享。 b)将Runnable对象作为某一个类中的内部类,共享数据作为这个外部类的成员变量,每个线程对共享数据的访问也交给外部类的方法,比便对共享数据的互斥和通信。Runnable对象调用外部类的操作这个共享数据的方法。 还有一种方式是a)和b)的结合实现,把共享数据封装到一个对象当中去,这个对象也实现对这个共享数据的操作,这个对象作为外部类的成员变量。然后再创建多个Runnable对象做为内部类,操作这个对象。 总结:对于要是下同步互斥的代码要放在不同的方法中,并且放在同一个对象当中,容易实现互斥和通信,并且也有利于日后的维护。这样思路也很清晰。 如有不妥之处,敬请指正。

java线程类中,可以实现对数据库的操作吗?

当然是可以的,在线程里面会有很多程序,可以调用任何程序啊,这样调用的程序都在一个线程里完成的。在这个过程中当然也可以调用database类来完成对数据库的操作。

java线程读取数据库

//将数据库中的数据条数分段

public void division(){

//获取要导入的总的数据条数

String sql3="SELECT count(*) FROM [CMD].[dbo].[mycopy1]";

try {

pss=cons.prepareStatement(sql3);

rss=pss.executeQuery();

while(rss.next()){

System.out.println("总记录条数:"+rss.getInt(1));

sum=rss.getInt(1);

}

//每30000条记录作为一个分割点

if(sum=30000){

n=sum/30000;

residue=sum%30000;

}else{

java多线程下如何保证数据的一致性

以mysql来说,可能出现脏读、不可重复读以及幻读,mysql默认设置是可重复读,即一次事务中不会读取到不同的数据。

可以做如下操作:

1)打开两个客户端,均设置为RR;

2)在一个事务中,查询某个操作查到某份数据;比如是某个字段version=1存在数据;

3)在另一个事务中,删除这份version=1的数据;删除后,在2所属的事务中查询数据是没有变化的,还是存在version=1的数据;

4)当我们在2所属的事务中继续更新数据,那么会发现更新不了,明明我们就看到了这份version=1的数据;

缓存一致性:

缓存一致,与什么一致?是与数据库一致,对外查询每个时刻一致;所以在针对于缓存与数据库之间该先更新哪一个呢?可能有人觉得我先更新数据库,再更新缓存不就行了吗?但是有想过个问题吗?

当用户已经支付成功了,更新到数据库,但是呢?你还在缓存中显示未支付,在用户点击频率很高并且数据库压力过大,来不及同步到缓存时,那你是不是很尴尬,这就是典型的不一致了。此时用户再支付,那你又告诉他已经支付了,那他会把你骂死的

那该怎么来做呢?我们可以这样,先更新缓存再更新数据库,那么存在什么问题呢?

1)缓存更新成功,但是数据库更新失败,而被其它的并发线程访问到

2)缓存淘汰成功,但是数据库更新失败,这也会引发后期数据不一致

java怎么在线程里面获取数据

import java.io.*;

class DownThread extends Thread {

//定义字节数组(取水的竹筒)的长度

private final int BUFF_LEN = 32;

//定义读取的起始点

private long start;

//定义读取的结束点

private long end;

//读取文件对应的输入流

private InputStream is;

//将读取到的字节输出到raf中

private RandomAccessFile raf;

//构造器,传入输入流,输出流和读取起始点、结束点

public DownThread(long start, long end, InputStream is, RandomAccessFile raf) {

//输出该线程负责读取的字节位置

System.out.println(start + "----" + end);

this.start = start;

this.end = end;

this.is = is;

this.raf = raf;

}

public void run() {

try {

is.skip(start);

raf.seek(start);

//定义读取输入流内容的的缓存数组(竹筒)

byte[] buff = new byte[BUFF_LEN];

//本线程负责读取文件的大小

long contentLen = end - start;

//定义最多需要读取几次就可以完成本线程的读取

long times = contentLen / BUFF_LEN + 4;

//实际读取的字节数

int hasRead = 0;

for (int i = 0; i times; i++) {

hasRead = is.read(buff);

//如果读取的字节数小于0,则退出循环!

if (hasRead 0) {

break;

}

raf.write(buff, 0, hasRead);

}

} catch (Exception ex) {

ex.printStackTrace();

}

//使用finally块来关闭当前线程的输入流、输出流

finally {

try {

if (is != null) {

is.close();

}

if (raf != null) {

raf.close();

}

} catch (Exception ex) {

ex.printStackTrace();

}

}

}

}

public class MutilDown {

public static void main(String[] args) {

final int DOWN_THREAD_NUM = 4;

final String OUT_FILE_NAME = "d:/copy勇敢的心.rmvb";

InputStream[] isArr = new InputStream[DOWN_THREAD_NUM];

RandomAccessFile[] outArr = new RandomAccessFile[DOWN_THREAD_NUM];

try {

isArr[0] = new FileInputStream("d:/勇敢的心.rmvb");

long fileLen = getFileLength(new File("d:/勇敢的心.rmvb"));

System.out.println("文件的大小" + fileLen);

//以输出文件名创建第一个RandomAccessFile输出流

outArr[0] = new RandomAccessFile(OUT_FILE_NAME, "rw");

//创建一个与文件相同大小的空文件

for (int i = 0; i fileLen; i++) {

outArr[0].write(0);

}

//每线程应该读取的字节数

long numPerThred = fileLen / DOWN_THREAD_NUM;

//整个文件整除后剩下的余数

long left = fileLen % DOWN_THREAD_NUM;

for (int i = 0; i DOWN_THREAD_NUM; i++) {

//为每个线程打开一个输入流、一个RandomAccessFile对象,

//让每个线程分别负责读取文件的不同部分。

if (i != 0) {

isArr[i] = new FileInputStream("d:/勇敢的心.rmvb");

//以指定输出文件创建多个RandomAccessFile对象

outArr[i] = new RandomAccessFile(OUT_FILE_NAME, "rw");

}

if (i == DOWN_THREAD_NUM - 1) {

//最后一个线程读取指定numPerThred+left个字节

new DownThread(i * numPerThred, (i + 1) * numPerThred

+ left, isArr[i], outArr[i]).start();

} else {

//每个线程负责读取一定的numPerThred个字节

new DownThread(i * numPerThred, (i + 1) * numPerThred,

isArr[i], outArr[i]).start();

}

}

} catch (Exception ex) {

ex.printStackTrace();

}

}

public static long getFileLength(File file) {

long length = 0;

//获取文件的长度

long size = file.length();

length = size;

return length;

}

}

java 多线程存储数据库

以mysql为数据库写的一个粗陋的demo,你参考一下,希望不会因为代码过多被百度吞了——

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.util.ArrayList;

import java.util.List;

public class Test {

       

    public static void main(String[] args) {

        allotThread();

    }

       

    /**

     * 将100条数据分成10份并启动10个线程分别操作

     */

    public static void allotThread() {

        ListString[] datas = buildDatas();

        for (int i=0; i100; i+=10) {

            ListString[] tenDatas = datas.subList(i, i + 10);

            insertData(tenDatas);

        }

    }

       

    /**

     * 创建100条模拟数据

     * @return

     */

    public static ListString[] buildDatas() {

        ListString[] datas = new ArrayListString[]();

        for (int i=0; i100; i++) {

            String[] data = {"id " + i, "name " + i};

            datas.add(data);

        }

        return datas;

    }

       

    /**

     * 启动线程进行数据插入操作

     * @param tenDatas

     */

    public static void insertData(final ListString[] tenDatas) {

        new Thread(new Runnable() {

            public void run() {

                String sql = "insert into testtable (id, name) values (?, ?)";

                Connection conn = null;

                PreparedStatement pstmt = null;

                try {

                    conn = getConnection();

                    conn.setAutoCommit(false);

                    pstmt = getPstmt(conn, sql);

                    for (String[] data : tenDatas) {

                        pstmt.setString(1, data[0]);

                        pstmt.setString(2, data[1]);

                        pstmt.addBatch();

                    }

                    pstmt.executeBatch();

                    conn.commit();

                    conn.setAutoCommit(true);

                } catch (SQLException e) {

                    e.printStackTrace();

                    rollback(conn);

                } catch (ClassNotFoundException e) {

                    e.printStackTrace();

                } finally {

                    close(pstmt);

                    close(conn);

                }

            }

        }).start();

    }

       

    public static Connection getConnection() throws SQLException, ClassNotFoundException {

        Class.forName("com.mysql.jdbc.Driver");

        String dbUrl = "jdbc:mysql://localhost/test?useUnicode=truecharacterEncoding=UTF-8";

        Connection conn = DriverManager.getConnection(dbUrl, "root", "tooeasy");

        return conn;

    }

       

    public static PreparedStatement getPstmt(Connection conn, String sql) throws SQLException, ClassNotFoundException {

        PreparedStatement pstmt = conn.prepareStatement(sql);

        return pstmt;

    }

       

    public static void rollback(Connection conn) {

        try {

            if (null != conn) {

                conn.rollback();

            }

        } catch (SQLException e) {

            e.printStackTrace();

        }

    }

       

    public static void close(Connection conn) {

        try {

            if (null != conn) {

                conn.close();

            }

        } catch (SQLException e) {

            e.printStackTrace();

        }

    }

       

    public static void close(PreparedStatement pstmt) {

        try {

            if (null != pstmt) {

                pstmt.close();

            }

        } catch (SQLException e) {

            e.printStackTrace();

        }

    }

       

    public static void close(ResultSet rs) {

        try {

            if (null != rs) {

                rs.close();

            }

        } catch (SQLException e) {

            e.printStackTrace();

        }

    }

}

关于java线程数据和java线程数据交互的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

The End

发布于:2022-12-01,除非注明,否则均为首码项目网原创文章,转载请注明出处。